在涉及声明合并的重载函数中键入“ this”参数?

时间:2018-10-22 00:50:21

标签: typescript

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

enter image description here

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

enter image description here

我在这里做错了什么?我正在使用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;
};

1 个答案:

答案 0 :(得分:0)

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

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

strict没有过载时,我无法重现错误:当我保留一个呼叫签名并注释掉另一个呼叫签名时,我仍然会收到错误。