TypeScript 类型兼容性整理

一、介绍

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中没有返回参数location
x=y;
3.可选参数及剩余参数

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

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

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

三、枚举

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

//枚举
//枚举类型与数字类型兼容,并且数字黑星与枚举类型兼容。不同枚举类型之间是不兼容的.
enum Status{
    Ready,
    Warting
}
enum Color{
    Red,
    Blue,
    Green
}
console.log(Status.Ready==0); //输出true
let status=Status.Ready; //输出0
console.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;  //OK
s = 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>使用整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值