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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:47:32