前言
文中内容都是参考https://www.typescriptlang.org/docs/handbook/type-compatibility.html#handbook-content 内容。
枚举的类型兼容性
枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。比如,
enum Status {
Pending,
Resolved,
Rejected,
}
let current = Status.Pending;
let num = 0;
current = num;
num = current;
不同枚举类型之间是不兼容的, 如下例:
enum Status {
Pending,
Resolved,
Rejected,
}
enum Color {
Red,
Blue,
Green,
}
let current = Status.Pending;
let color = Color.Red;
current = color;
// 不能将类型“Color.Red”分配给类型“Status”
泛型的兼容性
因为TypeScript是结构性的类型系统,对于泛型的兼容性, 只有当它的类型参数被一个成员使用时,才会影响其兼容性。如下:
interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;
x = y; // 没毛病
以上代码里, x
和y
是兼容的, 因为它们的结构使用类型参数时并没有什么不同。即类型参数T
对兼容性无任何影响。
下面把这个例子改一改, 接口里增加一个成员:
interface NotEmpty<T> {
data: T;
}
let x: NotEmpty<number>;
let y: NotEmpty<string>;
x = y;
// 不能将类型“NotEmpty<string>”分配给类型“NotEmpty<number>”。
// 不能将类型“string”分配给类型“number”
此时会提示不能将类型“NotEmpty<string>”分配给类型“NotEmpty<number>, 不能将类型“string”分配给类型“number”
的错误。 即当类型参数T
被成员使用时, 将会在泛型实例化后影响其兼容性。
对于未指定泛型类型的泛型参数时,TypeScript会把所有未明确指定的泛型参数当成any
比较。 然后用结果类型(实例化泛型)进行比较, 如同上一个例子。
let identity = function <T>(x: T): T {
// ...
return x;
};
// let identity: <T>(x: T) => T
let reverse = function <U>(y: U): U {
// ...
return y;
};
// let reverse: <U>(y: U) => U
identity = reverse; // 没毛病
identity
类型为 <T>(x: T) => T
, reverse
类型为<U>(y: U) => U
, identity
与reverse
相互兼容, 是因为TypeScript会把所有未明确指定的泛型参数当成any
比较, 即(x: any) => any
匹配 (y: any) => any
。
类中的泛型兼容性与上面所述一致:
class List<T> {
add(val: T) {}
}
class Animal {
name: string;
}
class Dog extends Animal {
run() {}
}
const animals = new List<Animal>();
let a: Animal;
let d: Dog;
a = d; // 没毛病
animals.add(new Animal()); // 没毛病
animals.add(new Dog()); // 没毛病
const dogs = new List<Dog>();
dogs.add(new Animal());
// 类型“Animal”的参数不能赋给类型“Dog”的参数。
// Property 'run' is missing in type 'Animal' but required in type 'Dog'
dogs.add(new Dog());
Animal
类与 Dog
类不互相兼容。
以上ts代码均在 https://www.typescriptlang.org/play 上运行过(注: 配置strictNullChecks: false
),版本为4.7.2。
最后, 如有错误,欢迎各位大佬指点!感谢!
参考资料
https://www.typescriptlang.org/docs/handbook/type-compatibility.html#handbook-content
https://jkchao.github.io/typescript-book-chinese/typings/typeCompatibility.html