如何提取常量数组中符合查询类型的所有对象的联合类型?
解决方案
当然可以实现这个需求,甚至不需要自己写复杂的条件类型,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>;
原理说明
T[number]:获取数组T的所有元素的联合类型。对于你的X来说,这个类型是{readonly a: 1; readonly b: 2} | {readonly a: 3; readonly b: 2} | {readonly a: 5; readonly b: 4}。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
相关产品推荐
相关产品推荐

