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

如何改写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:01:08