繁体   English   中英

申报单是否会影响TypeScript类型扣除?

[英]Should the declaration order affect TypeScript type deduction?

似乎 TypeScript 的翻译器在某种程度上依赖于声明的顺序,至少在重载函数的情况下。

假设我们有 2 维和 3 维向量的类:

class Vector2 {
  public get x() : number
  public get y() : number
}
class Vector3 {
  public get x() : number
  public get y() : number
  public get z() : number
}

我们有一个重载的 function 接受Vector2Vector3

function add(a : Vector2, b : number) : Vector2;
function add(a : Vector3, b : number) : Vector3;

根据add()的哪个签名首先出现 - 使用Vector2Vector3结果 - 编译器可能会推断出不同类型的结果,即使我们将Vector3作为参数传递也是如此。 例如,在与上述相同的顺序的情况下,以下代码:

const r = add(new Vector3, 5)

将返回Vector2而不是Vector3 因此,如果我们将r的可能类型限制为Vector3

const r : Vector3 = add(new Vector3, 5)

代码不会编译。

应该是这样吗? 因为对我来说,这看起来像是翻译器的错误。

这是 Typescript 的预期行为:当您调用重载的 function 时,编译器会选择在调用点兼容的第一个重载签名,而不是最具体的签名。 文档

TypeScript 在解析 function 调用时选择第一个匹配的重载 当早期的重载比后面的“更通用”时,后面的重载被有效地隐藏并且不能被调用。

由于您的Vector3Vector2结构子类型,因此Vector3重载签名更具体,因此您应该在Vector2重载签名之前编写该签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM