为什么在TypeScript中我们可以将与strmmts不兼容的函数重新分配给另一个函数?

Zhe*_*eng 0 typescript

我通过本指南https://basarat.gitbooks.io/typescript/content/docs/types/type-compatibility.html#types-of-arguments提出了这个问题。

示例代码:

/** Type Heirarchy */
interface Point2D { x: number; y: number; }
interface Point3D { x: number; y: number; z: number; }

/** Two sample functions */
let iTakePoint2D = (point: Point2D) => { /* do something */ }
let iTakePoint3D = (point: Point3D) => { /* do something */ }

iTakePoint3D = iTakePoint2D; // Okay : Reasonable
iTakePoint2D = iTakePoint3D; // Okay : WHAT
Run Code Online (Sandbox Code Playgroud)

显然,iTakePoint2D的签名与iTakePoint3D不兼容。我们将其用作iTakePoint2D({ x: 100, y: 200 }),然后它会导致运行时错误,程序无法访问point.z的值。

jca*_*alz 5

不管是好是坏,TypeScript中的函数参数都是双变量的(对于v2.5及以下版本)。TypeScript FAQ中的一个问题看起来很像您的问题:为什么它没有被类型系统捕获为错误?

答案是:强制功能PARAMATERS是逆变(它们可能比预期的更广泛的类型而不是窄)将标记为错误,同时也标志了一些常见的做法是错误的,他们真的不是。要解决这些问题,将需要大量的手动类型断言。基本上,为了方便起见,牺牲了一些正确性。(您:“什么?!您不能这样做!”他们:“请看TypeScript设计非目标3和绝望”)

Microsoft / TypeScript#14973中也有一些原因的讨论,其中提到了当您从这里开始严格执行参数矛盾时出现的编译器性能问题。

但!请继续留意可能的编译器标志,该标志会对独立功能(而非方法)强制实施此标志。不知道这是否真的可以将它纳入TypeScript 2.6或将来的版本中,但是似乎正在对此进行工作。


希望能有所帮助;祝好运!

编辑:嗯,似乎您链接非常文档对此进行了解释。双变量使一些好事情发生(请参阅文档中的事件处理程序代码),而使一些坏事情(您发布的代码)发生。也许拼写不够?那好吧。