如何改写TypeScript泛型类型Remaining实现单参数自动推断?
问题:简化TypeScript的Remaining泛型类型
现有以下TypeScript类型定义:
type FooBar = { foo: string; bar: string; } type PickedFoo = Pick<FooBar, "foo">; // type PickedFoo = { // foo: string; // } type Remaining<Picked extends Pick<T, any>, T> = Omit<T, keyof Picked>; type RemainingBar = Remaining<PickedFoo, FooBar>; // type RemainingBar = { // bar: string; // }
现在需要把Remaining改写为只接受单个泛型参数,让它自动推断出被省略的键,实现如下效果:
type RemainingBar = Remaining<PickedFoo>; // type RemainingBar = { // bar: string; // }
解决方案
可以通过TypeScript的条件类型推断功能,让Remaining从传入的挑选后类型中反向推导出原始完整类型,从而省去第二个泛型参数。改写后的代码如下:
type FooBar = { foo: string; bar: string; } type PickedFoo = Pick<FooBar, "foo">; // 改写后的Remaining泛型类型 type Remaining<T> = T extends Pick<infer U, any> ? Omit<U, keyof T> : never; // 验证效果 type RemainingBar = Remaining<PickedFoo>; // 最终类型:{ bar: string; }
逻辑说明
- 首先用
T extends Pick<infer U, any>做条件判断:如果传入的T是某个类型U经过Pick操作后的结果,就通过infer U自动推断出原始的完整类型U(比如这里PickedFoo对应U就是FooBar)。 - 然后用
Omit<U, keyof T>从原始类型U里剔除掉T包含的所有键,剩下的就是未被挑选的部分,也就是我们需要的结果。
这样就不用手动传入原始类型,TypeScript会自动完成所有推断。
内容的提问来源于stack exchange,提问作者perstitute
相关产品推荐
相关产品推荐

