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
。@Slurpheo
strictThis
正是我在GitHub上搜索的东西,似乎是一个显而易见的名字:)