如何获取TypeScript联合类型中指定字段的类型?
解决联合类型中提取特定成员属性类型的问题
你遇到的错误是因为Combined是联合类型,其中Option2并没有items属性,TypeScript不允许直接索引一个并非联合所有成员都存在的属性。要获取Option1中items的类型,你可以用以下两种方法:
方法一:使用内置Extract工具类型
TypeScript提供了Extract工具类型,可以从联合类型中筛选出符合指定条件的成员。我们先筛选出带有items字段的类型,再提取其items属性的类型:
type Option1 = { items: string[]; } type Option2 = { delete: true; } type Combined = Option1 | Option2; // 提取联合类型中包含items字段的成员,再获取其items的类型 type ItemsType = Extract<Combined, { items: unknown }>["items"]; const items_variable: ItemsType = ["a", "b"]; // 编译正常
Extract<Combined, { items: unknown }>会从Combined中筛选出可以赋值给{ items: unknown }的类型(也就是Option1),之后再索引["items"]就完全安全了。
方法二:自定义条件类型
如果你想手动实现筛选逻辑,可以用条件类型配合infer关键字来推断属性类型:
type Option1 = { items: string[]; } type Option2 = { delete: true; } type Combined = Option1 | Option2; // 遍历联合类型成员,提取带有items字段的类型的属性类型 type GetItemsType<T> = T extends { items: infer U } ? U : never; const items_variable: GetItemsType<Combined> = ["a", "b"]; // 编译正常
这个条件类型会逐个检查联合类型的成员:如果当前成员包含items字段,就用infer推断出该字段的类型U;否则返回never。最终GetItemsType<Combined>的结果就是string[]。
两种方法都能解决你的问题,推荐使用第一种Extract的方式,因为它是TypeScript内置的工具类型,代码更简洁易读。
内容的提问来源于stack exchange,提问作者jakeanq
相关产品推荐
相关产品推荐

