首页 > 解决方案 > 在涉及声明合并的重载函数中键入“this”参数?

问题描述

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

在此处输入图像描述

我不太清楚为什么,错误说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;
};

标签: typescript

解决方案


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

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

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


推荐阅读