1.TS与JS的区别
TS使基于JS之上的一种语言,它由微软公司开发,在前端领域已经变得越来越重要了。在我的个人理解中TS和JS的本质区别:
TS是强类型语言,而JS是一种弱类型语言(强类型和弱类型语言没有具体的定义,我认为他们的区别是TS无隐形转换,变量的类型不能随意改变)
2.TS基于JS基础上新增的类型定义
(1) 元组类型(tuple)
元组就是数组,但是在TS元组是形容可以容纳不同类型的数组
const mytuple = [10,"Hello","World","typeScript"];
(2) 枚举类型(enum)
枚举类型就是用于定义数值集合。
enum Jay {
jay = 3,
jin = 1,
xiaoJAY = 2
}
0,1,2是jay等key代表的值,如果不加数字那么他就会从0开始递增
enum Jay {
jay, //0
jin, //1
xiaoJAY //2
}
一般在项目声明常量时我们会经常用到枚举
(3) void类型(void)
用于标识函数方法返回值的类型,表示该方法没有返回值。
function hello(): void {
alert("Hello Runoob");
}
(4) never类型(never)
never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。
let x: never;
let y: number;
// 运行错误,数字类型不能转为 never 类型
x = 123;
// 运行正确,never 类型可以赋值给 never类型
x = (()=>{ throw new Error('exception')})();
// 运行正确,never 类型可以赋值给 数字类型
y = (()=>{ throw new Error('exception')})();
// 返回值为 never 的函数可以是抛出异常的情况
function error(message: string): never {
throw new Error(message);
}
// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop(): never {
while (true) {}
}
3.TS中的其他定义
(1) 接口(interface)
接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。
interface Person {
firstName:string,
lastName:string,
allName ?: string // ?代表着改属性在继承时可有可无
sayHi: ()=>string
}
// 继承接口的对象必须要拥有接口中的所有必须数据,不然会报错
const customer:Person = {
firstName:"Tom",
lastName:"Hanks",
sayHi: ():string =>{return "Hi there"}
}
interface namelist {
[index:string]:string // 这样书写代表这可以接收任意字符串的参数
}
//extends关键字
interface Person {
age:number
}
interface Musician extends Person {
instrument:string
}
interface Person1 {
age:number
}
interface Musician extends Person {
instrument:string
}
// 需要age和instrument属性同时存在才不会报错
let drummer: Musician = {
age: 10,
instrument: 'jay'
};
(2) 命名空间(namespace)
命名空间一个最明确的目的就是解决重名问题。
命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。
namespace SomeNameSpaceName {
export interface ISomeInterfaceName { }
export class SomeClassName { }
}
要在另外一个命名空间调用语法格式为:
SomeNameSpaceName.SomeClassName;