You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:02