如何在TypeScript泛型方法签名中使用getter属性的key类型
报错原因
- 本质是TypeScript对类内多态this的推断限制:定义
K extends keyof this['config']时,这里的this是可随子类继承变化的多态类型,但基类内部直接读取this.config时,TS会默认将其收敛为基类当前定义的固定config类型{ foo: string },类型系统无法确认泛型K(可能包含子类新增的key)一定可以索引基类的固定config类型,因此抛出索引错误。
解决方案
无需额外定义泛型接口或给类加泛型参数,仅需在基类access方法中给this.config显式断言为多态的this['config']类型即可,修改后代码如下:
class Parent { public get config() { return { foo: 'lorem', }; } public access<K extends keyof this['config']>(key: K): this['config'][K] { // 断言告知TS this.config遵循多态this的config定义,而非基类固定类型 return (this.config as this['config'])[key]; } } class Child extends Parent { public override get config() { return { foo: 'lorem', bar: 'ipsum', }; } } new Parent().access('foo'); // 类型正常,返回string new Child().access('bar'); // 类型正常,返回string
- 该改动完全符合简化需求:所有类型定义都在类内部完成,子类重写
config后access方法的入参、返回值类型会自动适配新的config结构。
内容的提问来源于stack exchange,提问作者Alec
相关产品推荐
相关产品推荐

