Typescript 为什么函数带有一个显式的;此参数为“;可分配给不太具体的签名?
如果函数Typescript 为什么函数带有一个显式的;此参数为“;可分配给不太具体的签名?,typescript,Typescript,如果函数a的签名要求使用显式this类型(即this:{x:number})调用它,为什么它可以分配给不太具体的签名(即()=>string) 由于以下原因导致运行时错误: 打字手册: 这是一个新的--strict选项所涵盖的内容,还是对以前存在的--strictFunctionTypes选项的限制?问题是,如果未指定,函数的this类型是隐式的any,因此您的完整定义是: function a(this: {x : number}) { return ""; } function
a
的签名要求使用显式this
类型(即this:{x:number}
)调用它,为什么它可以分配给不太具体的签名(即()=>string
)
由于以下原因导致运行时错误:
打字手册:
这是一个新的
--strict
选项所涵盖的内容,还是对以前存在的--strictFunctionTypes选项的限制?问题是,如果未指定,函数的this
类型是隐式的any
,因此您的完整定义是:
function a(this: {x : number}) {
return "";
}
function b(fn: (this: any)=> string) { }
这两个函数是兼容的,因为any
可以分配给任何其他类型,包括{x:number}
,并且即使在strictFunctions
和strict
下也允许这种行为
确保不兼容的唯一方法是将b
上的this
定义为void
,表示没有此
将传递给fn
:
function a(this: {x : number}) {
return "";
}
function b(fn: (this: void)=> string) { }
b(a); //error
至于为什么这不是默认行为,编译器团队对此有一个公开的问题,所以我猜他们正在研究它。请参阅主题上的和a,这有点正确,但我觉得问题是,为什么类型系统不跟踪
此
的需要,即使通过检查,它显然是必需的,并且使用a
调用b
时不报告错误a()
从技术上讲可能永远是一个错误。@AluanHaddad我认为这是一个未实现的特性,因为此
隐式地任何,并且此
被视为任何其他兼容参数。。兼容性是编译器的结论reaches@AluanHaddad,添加相关问题和讨论,显然他们正在研究:)@TitianCernicova Dragomir感谢链接到该问题。我觉得有点遗憾,我昨天没有自己搜索(或建议搜索)——strictThis
。@SlurpheostrictThis
正是我在GitHub上搜索的东西,似乎是一个显而易见的名字:)