TypeScript中如何获取联合类型接口指定分支的嵌套属性?
TypeScript联合类型中精准访问指定接口的属性
编译时类型提取
如果仅需要在类型层面获取A2中a.c的类型,可以使用TypeScript内置的Extract工具类型,从联合类型中筛选出A2成员后再链式访问属性:
// 直接提取联合类型中的A2并访问属性 type E = Extract<D["abc"], A2>["a"]["c"];
Extract<T, U>会从类型T中提取出可分配给U的部分,这里就是从A | A2中精准筛选出A2,后续访问a.c就不会出现属性不存在的错误。
运行时安全访问
如果需要在运行时代码中安全访问该属性,需要配合类型守卫让TypeScript推断出当前对象是A2类型:
方式一:直接使用in操作符
function getCValue(obj: D): C["c"] { if ("c" in obj.abc.a) { // TypeScript自动推断obj.abc为A2类型 return obj.abc.a.c; } throw new Error("当前对象不属于A2类型"); }
方式二:自定义类型守卫函数
// 定义类型守卫,判断对象是否为A2类型 function isA2(abc: A | A2): abc is A2 { return "c" in (abc as A2).a; } function getCValue(obj: D): C["c"] { if (isA2(obj.abc)) { // 此处obj.abc已被推断为A2类型 return obj.abc.a.c; } throw new Error("当前对象不属于A2类型"); }
内容的提问来源于stack exchange,提问作者Rahul Yadav
相关产品推荐
相关产品推荐

