类型推论和类型别名
类型推论
TypeScript 会在没有明确的指定类型的时候推测出一个类型。
以下代码虽然没有指定类型,但是会在编译的时候报错:
let myFavoriteNumber = "seven";
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
事实上,它等价于:
let myFavoriteNumber: string = "seven";
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
注意:如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成
any类型而完全不被类型检查。
let myFavoriteNumber;
myFavoriteNumber = "seven";
myFavoriteNumber = 7;
类型别名(type)
使用type给类型定义别名,定义的类型可以是联合类型,void 类型,基础类型等:
type s = string | number;
let str: s = "定义类型";
与 interface 区别
interface也可以给类型进行进行定义,但是:
interface可以使用extends继承别的interface,而type只能使用交叉类型将别的类型合并到一起:type s = number[] & B; interface A extends B {}interface无法在外部表示联合类型,只能在内部的属性里表示;而type很好表示联合类型:type s = number[] | string; interface A extends B { name: string | number; }interface遇到重名的interface会自动合并;type在同一个命名空间不接受重名;
extends
type可以使用extends做包含的意思,让extends左边的值作为右边类型的子类型:
type num = 1 extends number ? 1 : 0;