为什么具有明确“this parameter”的函数可以分配给不太具体的签名?

时间:2018-04-04 20:43:56

标签: typescript

如果函数a的签名要求使用显式this类型(即this: { x: number })进行调用,为什么它可以分配给不太具体的签名(即, () => string)?

因此导致的运行时错误: Runtime Error

TypeScript-Handbook:this parameter

这是新--strict选项涵盖的内容还是以前存在的〜--strictFunctionTypes选项的限制?

1 个答案:

答案 0 :(得分:3)

问题在于,如果未指定,则函数的this类型隐式any,因此您的完整定义为:

function a(this: {x : number}) {
    return "";
}

function b(fn: (this: any)=> string) { }

这两个功能兼容,因为any可以分配给任何其他类型,包括{x : number},即使在strictFunctionsstrict下也允许此行为。

确保不兼容的唯一方法是将this上的b定义为void,以表示不会将this传递给fn }}:

function a(this: {x : number}) {
    return "";
}
function b(fn: (this: void)=> string) { }

b(a); //error

关于为什么这不是默认行为的问题,编译器团队对此有一个未解决的问题,所以我猜他们正在研究它。请参阅主题

上的issuediscussion