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

TypeScript联合类型成员兄弟属性未推断,如何获取完整正确类型?

TypeScript类型推断问题:无法识别兄弟属性

问题代码示例:

const schema = {
  oneOf: [
    {
      prop1: { prop11: "A", prop12: 12 },
      prop2: { prop21: "1" }
    },
    {
      prop1: { prop11: "B" }
    }
  ]
} as const;

schema.oneOf.map(t => {
  
  if(t.prop1.prop11 === "A"){
    t.prop1.prop12 === 12; // 类型推断正常
    t.prop2; // TypeScript报错,无法识别该属性存在
  }
})

问题说明:当通过嵌套属性prop1.prop11 === "A"进行类型收窄时,TypeScript能正确推断t.prop1的完整结构,但无法同步推断出t存在prop2属性。


解决方案1:自定义类型谓词

先提取联合类型,再定义类型谓函数明确判断目标类型:

const schema = {
  oneOf: [
    {
      prop1: { prop11: "A", prop12: 12 },
      prop2: { prop21: "1" }
    },
    {
      prop1: { prop11: "B" }
    }
  ]
} as const;

// 提取oneOf的元素类型
type SchemaItem = typeof schema.oneOf[number];
// 筛选出包含prop2的目标类型
type SchemaItemWithProp2 = Extract<SchemaItem, { prop1: { prop11: "A" } }>;

// 自定义类型谓词,告诉TS满足条件时的具体类型
function isItemWithProp2(item: SchemaItem): item is SchemaItemWithProp2 {
  return item.prop1.prop11 === "A";
}

schema.oneOf.map(t => {
  if(isItemWithProp2(t)){
    t.prop1.prop12; // 正常推断
    t.prop2; // 现在能正确识别该属性
  }
})

解决方案2:直接使用类型断言配合Extract

在条件分支内通过类型断言收窄类型:

const schema = {
  oneOf: [
    {
      prop1: { prop11: "A", prop12: 12 },
      prop2: { prop21: "1" }
    },
    {
      prop1: { prop11: "B" }
    }
  ]
} as const;

type SchemaItem = typeof schema.oneOf[number];

schema.oneOf.map(t => {
  if(t.prop1.prop11 === "A"){
    // 将t断言为匹配的具体类型
    const matchedItem = t as Extract<SchemaItem, { prop1: { prop11: "A" } }>;
    matchedItem.prop1.prop12;
    matchedItem.prop2; // 类型推断正常
  }
})

解决方案3:重构为顶层判别式联合

将判别属性移到顶层,让TS自动完成联合类型细化:

// 重构为顶层判别式结构
const schema = {
  oneOf: [
    {
      type: "A", // 顶层判别属性
      prop1: { prop12: 12 },
      prop2: { prop21: "1" }
    },
    {
      type: "B"
    }
  ]
} as const;

schema.oneOf.map(t => {
  if(t.type === "A"){
    t.prop1.prop12;
    t.prop2; // TS自动识别该属性存在
  }
})

内容的提问来源于stack exchange,提问作者user5480949

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:25:03