除了前面javascript的7种原始数据类型,typescript还新增了枚举,接口,泛型,元组等数据类型
枚举
枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等
枚举成员会被赋值为从 0
开始递增的数字,同时也会对枚举值到枚举名进行反向映射:
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true
手动赋值:
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
上面的例子中,未手动赋值的枚举项会接着上一个枚举项递增
更多关于枚举的知识:https://www.cnblogs.com/zzalmo/p/11280529.html
接口
在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。
- 在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)
- TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对对象的形状进行描述
上面的例子中,我们定义了一个接口interface Person {
name:string;
age:number;
}
let tom:Person={
name:‘Tom’,
age:25
};
Person
,接着定义了一个变量tom
,它的类型是Person
。这样,我们就约束了tom
的形状必须和接口Person
一致。
接口一般首字母大写,有的编程语言中会建议接口的名称加上I
前缀。
可选属性:
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom'
};
可选属性:
interface Person {
name:string;
age?:number;
[x:string]:any;//x可以是任意符合命名的单词
}
let tom:Person ={
name:'Tom',
gender:'male'
};
可选属性:
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 89757,
name: 'Tom',
gender: 'male'
};
tom.id = 9527;
// index.ts(14,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
元组
数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。
定义一对值分别为 string
和 number
的元组:
let sam:string[]=['sam','bob'] //数组
let tom: [string, number] = ['Tom', 25];//元组
其实元组就是包含的不同类型元素的数组
也可以只赋值其中一项:
let tom: [string, number];
tom[0] = 'Tom';
但是当直接对元组类型的变量进行初始化或者赋值的时候,需要提供所有元组类型中指定的项
let tom: [string, number];
tom = ['Tom', 25];//正确
tom = ['Tom'];//错误
当添加越界的元素时,它的类型会被限制为元组中每个类型的联合类型:
let tom: [string, number];
tom = ['Tom', 25];
tom.push('male');//正确
tom.push(true);//错误
// Argument of type 'true' is not assignable to parameter of type 'string | number'.
泛型
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray<string>(3, 'x'); // ['x', 'x', 'x']
上例中,我们在函数名后添加了 <T>
,其中 T
用来指代任意输入的类型,在后面的输入 value: T
和输出 Array<T>
中即可使用了。
接着在调用的时候,可以指定它具体的类型为 string
。当然,也可以不手动指定,而让类型推论自动推算出来: