【问题标题】:Typing `this` parameters in overloaded function involving declaration merging?在涉及声明合并的重载函数中键入“this”参数?
【发布时间】:2018-10-22 00:50:20
【问题描述】:

我收到以下代码的类型错误:

我不太清楚为什么,错误是Type 'Cash' is not assignable to type 'string'。如果我不输入this 参数,它会起作用:

我在这里做错了什么?我正在使用 TS v3.1.3。

代码如下:

class Cash {}

interface Cash {
  text (): string;
  text ( text: string ): this;
}

Cash.prototype.text = function ( text?: string ) {
  return text === undefined ? 'foo' : this;
};

【问题讨论】:

  • 在您的示例中,Cash 是一种类型,而不是一个对象。所以它没有原型,你应该得到一个基于它的错误,而不是因为Cash 不是一个字符串。为什么要设置Cash的原型?
  • 你试图在接口本身上创建一个方法,而不是实现该接口的对象
  • 这只是部分代码,实际上有一个Cash 类,实际上你可以看到我附上的第二张截图没有显示任何错误。
  • 这似乎有点夸张,拥有class Cash {} 就是缺少的一切。事实上,让我用可重现的代码更新我的问题。
  • 问题更新,我希望你现在有你需要的所有信息。

标签: typescript


【解决方案1】:

正如错误消息所说,您的匿名函数Cash | "foo" 的返回类型不能分配给Cash.prototype.text 的任一调用签名的返回类型。根据this answer,您需要 (1) 使用类型断言或 (2) 定义一个命名重载函数(具有两个调用签名和一个实现签名),然后将该函数分配给 Cash.prototype.text

假设您禁用了noImplicitThis,如果您不注释this 参数,那么它默认为any。不管好坏,any 与任何东西的联合是any,因此匿名函数的返回类型为any,并且与Cash.prototype.text 的两个调用签名的返回类型兼容。这就是为什么在这种情况下您不会收到错误的原因。我强烈建议使用noImplicitThis(实际上是所有strict)来避免此类意外。

Cash.prototype.text 未重载时,我无法重现缺少错误:当我保留一个调用签名并注释掉另一个时,我仍然收到错误。

【讨论】:

  • 感谢您的信息!我没有正确表达自己,我的意思是如果签名是text ( text?: string ): string | this; 它可以工作,但是如果我用text (): string 重载这个签名,它就会停止工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多