一、基础
TypeScript里的类型兼容性是基于结构子类型的。
结构类型是一种只使用其成员来描述类型的方式
规则:如果x要兼容y,那么y至少具有与x相同的属性(x是y的子集)
interface Named { name: string; }let x: Named;let y = { name: 'Alice', location: 'Seattle' }; x = y;
函数
//比较两个函数let x = (a: number) => 0;let y = (b: number, s: string) => 0; y = x; // OKx = y; // Error
枚举
枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。
不同枚举类型之间是不兼容的
enum Status { Ready, Waiting };enum Color { Red, Blue, Green }; let status = Status.Ready; status = Color.Green; //error
类
比较两个类类型的对象时,只有实例的成员会被比较。 静态成员和构造函数不在比较的范围内
class Animal { feet: number; constructor(name: string, numFeet: number) { } }class Size { feet: number; constructor(numFeet: number) { } }let a: Animal;let s: Size; a = s; //OKs = a; //OK
类的私有成员
私有成员会影响兼容性判断。 当类的实例用来检查兼容时,如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。
泛型
对于没指定泛型类型的泛型参数时,会把所有泛型参数当成any比较
interface NotEmpty<T> { data: T; } let x: NotEmpty<number>; let y: NotEmpty<string>; x = y; // error, x and y are not compatible
作者:大富_大贵
链接:https://www.jianshu.com/p/1112a7de0491