TypeScript:从类的另一属性类型推断属性类型
问题描述
需要根据类中foo属性的字符串类型,推断bar属性的对应类型,规则如下:
- 当
foo为'x'时,bar类型为X接口 - 当
foo为'y'时,bar类型为Y接口 - 当
foo为'z'时,bar类型为Z接口
预期效果:在this.foo === 'z'的分支中,给bar赋值{y: value}时,TypeScript应触发类型错误,因为此时bar的类型应为Z。
原实现的问题
原代码中bar的类型被推断为X | Y | Z联合类型,无法在条件分支中根据foo的具体值窄化bar的精确类型,导致错误赋值无法被检测到。
正确实现方案
通过泛型类绑定foo的具体类型与bar的对应类型,让TypeScript能在分支中精确推断类型:
interface X { x: boolean } interface Y { y: boolean } interface Z { z: boolean } // 建立foo值到bar类型的映射关系 type FooToBarMap = { 'x': X; 'y': Y; 'z': Z; } // 泛型类,约束T为foo的合法取值 class MyClass<T extends keyof FooToBarMap> { private foo: T; private bar!: FooToBarMap[T]; constructor(foo: T) { this.foo = foo; } setBar(value: boolean) { if (this.foo === 'x') { // foo被窄化为'x',bar自动推断为X类型 this.bar = { x: value }; } else if (this.foo === 'y') { // bar自动推断为Y类型 this.bar = { y: value }; } else if (this.foo === 'z') { // 此处触发TypeScript错误:类型"{ y: boolean; }"不能赋值给类型"Z" this.bar = { y: value }; } console.log(this.bar, this.foo); } } // 实例化时自动推断泛型类型 const instanceX = new MyClass('x'); instanceX.setBar(true); const instanceZ = new MyClass('z'); instanceZ.setBar(false); // 代码中错误赋值处会被TypeScript标记
方案说明
- 用
FooToBarMap类型明确foo值与bar类型的对应关系,避免条件判断中的类型歧义 - 泛型类
MyClass<T>让每个实例的foo类型固定为具体的字符串字面量,而非联合类型 - 在
setBar的条件分支中,TypeScript会根据this.foo的窄化结果,自动识别bar的精确类型,从而在错误赋值时触发类型检查
内容的提问来源于stack exchange,提问作者ar099968
相关产品推荐
相关产品推荐

