原始数据类型
JavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。
let isDone: boolean = false; let decLiteral: number = 6; let myName: string = 'Tom'; let unusable: void = undefined; let u: undefined = undefined; let n: null = null;
undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:
// 非严格模式下这样不会报错 “strict”: false,
let num: number = undefined;
任意值
如果变量声明的时候未指定类型,则默认为任意值类型
let myFavoriteNumber: any = 'seven'; myFavoriteNumber = 7; let something; something = 'seven'; something = 7;
类型推论
let myFavoriteNumber = 'seven'; //ts会根据第一次赋值的变量类型来指定类型,所以myFavoriteNumber的类型会被指定为字符串 myFavoriteNumber = 7; //这样会报错
联合类型
let myFavoriteNumber: string | number; //可以同时设置多种类型 myFavoriteNumber = 'seven'; myFavoriteNumber = 7;
对象的类型——接口
interface Person { name: string; age: number; } let tom: Person = { name: 'Tom', age: 25 };
定义的变量比接口少或多了一些属性都是不允许的:
interface Person { name: string; age: number; } // 少了会报错 let tom: Person = { name: 'Tom' }; // 多了会报错 let tom: Person = { name: 'Tom', age: 25, gender: 'male' }; // index.ts(6,5): error TS2322: Type '{ name: string; }' is not assignable to type 'Person'. // Property 'age' is missing in type '{ name: string; }'.
有时我们希望不要完全匹配一个形状,那么可以用可选属性:
interface Person { name: string; age?: number; } let tom: Person = { name: 'Tom' };
有时候我们希望一个接口允许有任意的属性,使用 [propName: string] 定义了任意属性(name,age)取 string 类型的值。
interface Person { name: string; age?: number; [propName: string]: any; // 注意这里如果定义为字符串的话则会报错,以为和上面的age定义为number冲突 } let tom: Person = { name: 'Tom', gender: 'male' }; 只读属性 interface Person { readonly id: number; // 后期不可改变类型 name: string; age?: number; [propName: string]: any; }
数组的类型
let fibonacci: number[] = [1, 1, 2, 3, 5]; let fibonacci: number[] = [1, '1', 2, 3, 5]; //number数组如果里面有字符串类型,会报错 let fibonacci: Array = [1, 1, 2, 3, 5]; //泛型,后面会详细讲 let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }]; //任意类型的数组 //接口的方式定义数组 interface NumberArray { [index: number]: number; } let fibonacci: NumberArray = [1, 1, 2, 3, 5]; // 类数组 interface IArguments { [index: number]: any; length: number; callee: Function; }