TypeScript

method-signature 方法签名

https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/method-signature-style.md
推荐永远使用第二种做方法签名

  1. // method shorthand syntax
  2. interface T1 {
  3. func(arg: string): number;
  4. }
  5. // regular property with function type
  6. interface T2 {
  7. func: (arg: string) => number;
  8. }

配合严格模式,防止异常的参数协变:

  1. interface T1 {
  2. func: (arg: string) => number;
  3. }
  4. type T2 = {
  5. func: (arg: boolean) => void;
  6. };
  7. // this is equivalent to the overload
  8. // 利用交叉类型做函数重载
  9. interface T3 {
  10. func: ((arg: number) => void) &
  11. ((arg: string) => void) &
  12. ((arg: boolean) => void);
  13. }

subtyping 定义

Subtyping in TypeScript - 某兔的文章 - 知乎 https://zhuanlan.zhihu.com/p/371112840
我们在 21.05.10 - 图1 上加上一个扩展叫做 subtyping,这个扩展添加了两个内容

  • 新引入了一个类型与类型之间的关系,称为子类型关系, 我们用符号 <: 来表示。A 是 B 的子类型表示为 A <: B。
  • 新引入一个类型 unknown

我们有时候叫 unknown 为 顶类型(Top Type),而且对于新引入的 <:unknown ,我们同时添加了四条 Subtyping Rule 和一条 Typing Rule
Subtyping Rule:

  • S-Top: 对于任何类型 21.05.10 - 图221.05.10 - 图3
  • S-Arrow: 对于任何类型 21.05.10 - 图4: 如果 21.05.10 - 图5 而且 21.05.10 - 图6,那么 21.05.10 - 图7
  • S-Refl: 对于任何类型 21.05.10 - 图821.05.10 - 图9
  • S-Trans: 对于任何类型 21.05.10 - 图10: 如果 21.05.10 - 图11 而且 21.05.10 - 图12,那么 21.05.10 - 图13

Typing Rule:

  • T-Sub:如果在上下文中我们得知 21.05.10 - 图14 的类型是 21.05.10 - 图15, 并且 21.05.10 - 图16,那么我们可以知道,在当下上下文中,能推出 21.05.10 - 图17 的类型也是 21.05.10 - 图18

S-Top: 所有类型通用超类型为 unknow
S-Refl:所有类型自己为自己的子类型
S-Trans:子类型关系传递

lamda 演算用 => 箭头函数表示
T1 是 S1 子类型
S2 是 T2 子类型
S1 => S2 是 T1 => T2 子类型
参数体 逆变,返回体 协变。

手把手教写 TypeScript Transformer Plugin - newraina的文章 - 知乎 https://zhuanlan.zhihu.com/p/30360931