TypeScript类方法中为何必须声明this参数?报错原因解析
this: UsersModel参数? 先看这段代码:
export class UsersModel extends Model { getUser(this: UsersModel, name: string) { return this.where('first', '_ilike', `${name}%`).order('last', 'asc'); } }
如果去掉this: UsersModel这个参数,会触发如下类型错误:
Argument of type '
${string}%' is not assignable to parameter of type 'this["fields"]["first"] extends Model ? Fields<this["fields"]["first"]> : this["fields"]["first"]'.
原因解释
TypeScript中,类方法里的this默认是多态的this类型——也就是说,this会被推断为当前类或它的子类类型。这种设计是为了支持继承场景下的类型兼容,但在这个案例里反而带来了问题:
where方法的第三个参数类型依赖于this["fields"]["first"]的类型。如果this是多态的,TypeScript无法确定它到底是UsersModel还是某个子类,也就没法确定fields.first的具体类型(子类可能重写fields定义)。此时模板字符串${name}%的类型是string,但TypeScript不确定this["fields"]["first"]是否接受string,所以抛出类型不匹配错误。
而显式声明this: UsersModel,相当于把方法内的this类型固定为当前类,TypeScript就能明确fields.first的类型是字符串,自然就能匹配模板字符串的类型,错误也就消失了。
总结
显式声明this参数的核心作用是锁定方法执行时this的具体类型,消除多态this带来的类型不确定性,让TypeScript能正确推断依赖this的相关类型,解决类型校验不通过的问题。
内容的提问来源于stack exchange,提问作者Get Off My Lawn

