TypeScript如何定义带this上下文的函数?无法调用getBear该怎么解决?
TypeScript 携带this上下文的函数调用问题解答
问题原因
你代码中函数参数里定义的this: Animal是TypeScript特有的this参数语法,该参数仅用于类型校验,不会被当作真实参数处理:
- 它强制要求函数运行时的
this必须符合Animal类型定义 - 你直接调用
getBear()时,普通函数默认的this在非严格模式下指向全局对象,严格模式下为undefined,均不满足Animal的类型约束,因此TS会抛出调用错误。
解决方案
方法1:使用call/apply手动指定this上下文
提前创建符合Animal类型的对象,调用时通过call传入作为this指向:
type Animal = { name: string } function getBear(this: Animal) : Animal { this.name = "hi" return this } // 调用示例 const myBear = {} as Animal console.log(getBear.call(myBear).name) // 输出:hi
方法2:使用bind预先绑定this上下文
通过bind将this绑定到符合类型的对象上,后续可直接调用绑定后的函数:
const boundGetBear = getBear.bind({} as Animal) console.log(boundGetBear().name) // 输出:hi
方法3:将函数作为对象方法调用
把getBear挂载到符合Animal类型的对象上作为方法调用,此时this会自动指向当前对象:
const animalObj: Animal & {getBear?: typeof getBear} = {name: ""} animalObj.getBear = getBear console.log(animalObj.getBear().name) // 输出:hi
可选优化方案
如果不需要强制绑定this,也可以直接把Animal作为普通参数传入,规避this绑定的额外操作:
type Animal = { name: string } function getBear(animal: Animal) : Animal { animal.name = "hi" return animal } console.log(getBear({name: "init"}).name) // 输出:hi
内容的提问来源于stack exchange,提问作者PDHide
相关产品推荐
相关产品推荐

