TypeScript基础之枚举、泛型的兼容性

前言

文中内容都是参考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;    // 没毛病

以上代码里, xy是兼容的, 因为它们的结构使用类型参数时并没有什么不同。即类型参数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, identityreverse 相互兼容, 是因为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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值