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

如何提取常量数组中符合查询类型的所有对象的联合类型?

解决方案

当然可以实现这个需求,甚至不需要自己写复杂的条件类型,TypeScript内置的Extract工具类型就能直接搞定。

先看你的常量数组定义:

const X = [
 {a: 1, b: 2},
 {a: 3, b: 2},
 {a: 5, b: 4}
] as const satisfies {a: any};

我们可以这样定义Discriminator泛型:

type Discriminator<T extends readonly unknown[], U> = Extract<T[number], U>;

原理说明

  1. T[number]:获取数组T的所有元素的联合类型。对于你的X来说,这个类型是{readonly a: 1; readonly b: 2} | {readonly a: 3; readonly b: 2} | {readonly a: 5; readonly b: 4}。
  2. Extract<Union, U>:从联合类型Union中筛选出所有可以赋值给U的子类型。你传入的{b: 2}会匹配所有包含b:2属性的元素类型,正好得到你想要的结果。

验证效果

type b2 = Discriminator<X, {b: 2}>; 
// 结果:{readonly a: 1; readonly b: 2} | {readonly a: 3; readonly b: 2}

type b4 = Discriminator<X, {b: 4}>;
// 结果:{readonly a: 5; readonly b: 4}

完全符合预期。另外,由于X使用了as const断言,元素的属性是只读的,但这不会影响类型匹配——TypeScript的结构类型系统中,只读属性不影响赋值兼容性。

内容的提问来源于stack exchange,提问作者Robin De Schepper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:33:18