TypeScript中文手册
9,类型兼容性
- > TypeScript里的类型兼容性是基于结构子类型的。 > > 结构类型是一种只使用其成员来描述类型的方式。 它正好与名义(nominal)类型形成对比。 > > 在基于名义类型的类型系统中,数据类型的兼容性或等价性是通过明确的声明和/或类型的名称来决定的。结构性类型系统是基于类型的组成结构,且不要求明确地声明。 - > TypeScript结构化类型系统的基本规则是,如果`x`要兼容`y`,那么`y`至少具有与`x`相同的属性。 ### 9.1 比较两个函数 - 函数参数双向协变 当比较函数参数类型时,只有当源函数参数能够赋值给目标函数或者反过来时才能赋值成功。 - 可选参数及剩余参数 比较函数兼容性的时候,可选参数与必须参数是可互换的。 源类型上有额外的可选参数不是错误,目标类型的可选参数在源类型里没有对应的参数也不是错误。 当一个函数有剩余参数时,它被当做无限个可选参数。 - 函数重载 对于有重载的函数,源函数的每个重载都要在目标函数上找到对应的函数签名。 这确保了目标函数可以在所有源函数可调用的地方调用。 ### 9.2 枚举 - 枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。不同枚举类型之间是不兼容的。 ### 9.3 类 - 类与对象字面量和接口差不多,但有一点不同:类有静态部分和实例部分的类型。 比较两个类类型的对象时,只有实例的成员会被比较。 静态成员和构造函数不在比较的范围内。 - 私有成员会影响兼容性判断。 当类的实例用来检查兼容时,如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。 ### 9.4 泛型 - TypeScript是结构性的类型系统,类型参数只影响使用其做为类型一部分的结果类型。 - 对于没指定泛型类型的泛型参数时,会把所有泛型参数当成`any`比较。 然后用结果类型进行比较 #### 9.5 子类型与赋值 - 在TypeScript里,有两种类型的兼容性:子类型与赋值。 它们的不同点在于,赋值扩展了子类型兼容,允许给`any`赋值或从`any`取值和允许数字赋值给枚举类型或枚举类型赋值给数字。 - 语言里的不同地方分别使用了它们之中的机制。 实际上,类型兼容性是由赋值兼容性来控制的,即使在`implements`和`extends`语句也不例外。
顶部
收展
底部
[TOC]
目录
1,基础类型
2,变量声明
3,接口
4,类
5,函数
6,泛型
7,枚举
8,类型推论
9,类型兼容性
10,高级类型
11,符号Symbols
12,Iterators(迭代)
13,模块
14,命名空间
15,模块解析