TypeScript 类型兼容性整理

来源:互联网 发布:淘宝恶意刷流量软件 编辑:程序博客网 时间:2024/05/16 09:38

一、介绍

TypeScript里的类型兼容性是基于结构子类型的。结构类型是一种只使用其成员来描述类型的方式

它正好与名义(nominal)类型形成对比。

TypeScript的结构性子类型是根据JavaScript代码的典型写法来设计的。因为JavaScript里广泛的使用匿名对象,例如函数表达式和对象字面量,所以使用结构类型系统来描述类型比名义类型系统更好。

1.基本规则,具有相同的属性

//基本规则是具有相同的属性//类似继承,子类型中的属性在父类中都存在,反之则编译失败//特别说明,TypeScript中类的属性默认值都为undefined//属性为undefined的不会编译到js文件中去interface Named {    name: string;}class Person {    name: string;    age:number;}let p: Named;//Person没有继承Named//同样编译通过,运行通过p = new Person();p.name='张三丰';console.info(p);
二、函数兼容性

1.形参

//函数兼容性比较//形参需要包含关系//形参1是形参2的子类型,参数名字可以不相同let x=(a:number)=>0;let y=(b:number,s:string)=>0;x=y; //编译报错,x参数中没有s参数y=x;
2.返回类型

//返回类型,需要被包含关系//返回类型1,是返回类型2的子类型let x=()=>({name:'Alice'});let y=()=>({name:'Alice',location:'Seattle'});y=x; //编译报错,x中没有返回参数locationx=y;
3.可选参数及剩余参数

比较函数兼容性的时候,可选参数与必须参数是可互换的。 源类型上有额外的可选参数不是错误,目标类型的可选参数在源类型里没有对应的参数也不是错误。

当一个函数有剩余参数时,它被当做无限个可选参数。

这对于类型系统来说是不稳定的,但从运行时的角度来看,可选参数一般来说是不强制的,因为对于大多数函数来说相当于传递了一些undefinded

三、枚举

枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。不同枚举类型之间是不兼容的。

//枚举//枚举类型与数字类型兼容,并且数字黑星与枚举类型兼容。不同枚举类型之间是不兼容的.enum Status{    Ready,    Warting}enum Color{    Red,    Blue,    Green}console.log(Status.Ready==0); //输出truelet status=Status.Ready; //输出0console.log(status);status=2;console.log(status); //输出2//status=Color.Blue;//编译报错,不同枚举类型之间不兼容

四、类

类与对象字面量和接口差不多,但有一点不同:类有静态部分和实例部分的类型。 比较两个类类型的对象时,只有实例的成员会被比较。 静态成员和构造函数不在比较的范围内。

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
私有成员会影响兼容性判断。 当类的实例用来检查兼容时,如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。

五、泛型

因为TypeScript是结构性的类型系统,类型参数只影响使用其做为类型一部分的结果类型。

interface Empty<T> {}let x: Empty<number>;let y: Empty<string>;x = y;  // okay, y matches structure of x

六、高级注册

子类型与赋值

目前为止,我们使用了兼容性,它在语言规范里没有定义。 在TypeScript里,有两种类型的兼容性:子类型与赋值。 它们的不同点在于,赋值扩展了子类型兼容,允许给 any赋值或从any取值和允许数字赋值给枚举类型或枚举类型赋值给数字。

语言里的不同地方分别使用了它们之中的机制。 实际上,类型兼容性是由赋值兼容性来控制的甚至在 implementsextends语句里。 更多信息,请参阅 TypeScript语言规范.

更多:

TypeScript 类型推论整理

TypeScript 枚举使用整理

TypeScript 泛型<T>使用整理

原创粉丝点击