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
相关产品推荐
相关产品推荐

