为何TypeScript允许将(this: Foo)=>void赋值给()=>void类型?
TypeScript中带this参数的函数可赋值给无this参数类型的原因
先看你给出的代码:
class Foo { greet() { console.log('Hello World!') } } function fooFunction(this: Foo) { this.greet() } const func: () => void = fooFunction func()
这不是TypeScript的疏忽,而是有明确设计依据的:
this参数是类型检查专用的隐式参数:TypeScript里的this: Foo只是用来在类型层面约束函数内部this的类型,它不属于函数对外暴露的调用签名参数列表。所以(this: Foo) => void和() => void的调用签名(即调用时需要传入的参数)完全一致,符合TypeScript的函数兼容性规则,因此允许赋值。- 适配JavaScript的常见使用场景:在JS里,经常会把依赖
this的函数提取出来,之后通过bind、箭头函数或者调用时的上下文来绑定正确的this。TypeScript不想过度限制这种合理用法——比如如果你写const func = fooFunction.bind(new Foo()),之后调用func()就完全没问题。类型系统允许赋值,是给开发者留足手动处理this绑定的空间。 - 运行时崩溃是因为
this未正确绑定:TypeScript的类型系统只负责静态检查,不会追踪运行时this的实际绑定情况。直接调用func()时,严格模式下this是undefined,非严格模式下是全局对象,都不是Foo实例,自然会报错,但这属于运行时的问题,不是类型检查的范畴。
内容的提问来源于stack exchange,提问作者riv
相关产品推荐
相关产品推荐

