原始数据类型
let isDone: boolean = false; //布尔值
let decLiteral: number = 6; // 数值
let myName: string = 'Tom'; //字符串
let unusable: void = undefined; //void 类型的变量只能将它赋值为 undefined 和 null
let u: undefined = undefined; //undefined
let n: null = null; //null
任意值
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
// error: Type 'number' is not assignable to type 'string'.
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7; //true
类型推论
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
//error: Type 'number' is not assignable to type 'string'.
事实上,它等价于:
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
//error: Type 'number' is not assignable to type 'string'.
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查:
let myFavoriteNumber;
myFavoriteNumber = 'seven'; //true
myFavoriteNumber = 7; //true
联合类型
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
允许 myFavoriteNumber 的类型是 string 或者 number,但是不能是其他类型
对象的类型——接口
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
上面的例子中,我们定义了一个接口 Person,接着定义了一个变量 tom,它的类型是 Person。这样,我们就约束了 tom 的形状必须和接口 Person 一致。
interface Person {
name: string;
age: number;
}
let tom: Person = { //error,少一些属性是不允许的
name: 'Tom'
};
let tom: Person = { //error,多一些属性是不允许的
name: 'Tom',
age: 25,
gender: 'male'
};
可选属性:
interface Person {
name: string;
age?: number; //可选属性
}
let tom: Person = {
name: 'Tom'
};
任意属性:
interface Person {
name: string;
age?: number;
[propName: string]: any; //任意属性
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
//error: Property 'age' of type 'number' is not assignable to string
上例中,任意属性的值允许是 string,但是可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了