如果函数a
的签名要求使用显式this
类型(即this: { x: number }
)进行调用,为什么它可以分配给不太具体的签名(即, () => string
)?
TypeScript-Handbook:this parameter。
这是新--strict
选项涵盖的内容还是以前存在的〜--strictFunctionTypes
选项的限制?
答案 0 :(得分:3)
问题在于,如果未指定,则函数的this
类型隐式any
,因此您的完整定义为:
function a(this: {x : number}) {
return "";
}
function b(fn: (this: any)=> string) { }
这两个功能兼容,因为any
可以分配给任何其他类型,包括{x : number}
,即使在strictFunctions
和strict
下也允许此行为。
确保不兼容的唯一方法是将this
上的b
定义为void
,以表示不会将this
传递给fn
}}:
function a(this: {x : number}) {
return "";
}
function b(fn: (this: void)=> string) { }
b(a); //error
关于为什么这不是默认行为的问题,编译器团队对此有一个未解决的问题,所以我猜他们正在研究它。请参阅主题
上的issue和discussion