如何通过TypeScript嵌套字段确定父对象类型?
如何通过嵌套字段让TypeScript自动收窄联合类型?
这并非TypeScript的绝对限制,只是默认的控制流分析不会自动跟踪嵌套对象属性与父类型的关联关系,所以直接用log.nested.action作为switch条件时,无法联动收窄log本身的联合类型。不过有几种可行的解决方法:
方法1:自定义类型守卫函数
通过类型守卫明确关联嵌套字段值与父类型,让TypeScript能准确识别类型:
type TLog1 = { nested: { action: "log1"; }; nestedAdditional: { additionalField1: string; }; }; type TLog2 = { nested: { action: "log2"; }; nestedAdditional: { additionalField2: string; }; }; type TAnyLog = TLog1 | TLog2; // 自定义类型守卫 function isLog1(log: TAnyLog): log is TLog1 { return log.nested.action === "log1"; } function isLog2(log: TAnyLog): log is TLog2 { return log.nested.action === "log2"; } function myFunc(log: TAnyLog) { if (isLog1(log)) { console.log(log.nestedAdditional.additionalField1); // TypeScript正确识别为TLog1 return; } if (isLog2(log)) { console.log(log.nestedAdditional.additionalField2); // TypeScript正确识别为TLog2 return; } }
方法2:结合类型断言(需谨慎使用)
如果能确保类型判断的正确性,可以在switch分支中使用类型断言快速收窄类型:
function myFunc(log: TAnyLog) { switch (log.nested.action) { case "log1": const log1 = log as TLog1; console.log(log1.nestedAdditional.additionalField1); return; case "log2": const log2 = log as TLog2; console.log(log2.nestedAdditional.additionalField2); return; } }
这种方式简单直接,但需要自己保证断言的准确性,若后续类型结构变更容易引发错误。
方法3:重构类型结构(可选)
如果允许调整类型定义,可以将嵌套的action字段提升到顶层,利用TypeScript原生的判别式联合支持自动收窄:
type TLog1 = { action: "log1"; nestedAdditional: { additionalField1: string; }; }; type TLog2 = { action: "log2"; nestedAdditional: { additionalField2: string; }; }; type TAnyLog = TLog1 | TLog2; function myFunc(log: TAnyLog) { switch (log.action) { case "log1": console.log(log.nestedAdditional.additionalField1); return; case "log2": console.log(log.nestedAdditional.additionalField2); return; } }
内容的提问来源于stack exchange,提问作者Никита Белотелов
相关产品推荐
相关产品推荐

