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

如何实现TypeScript泛型类型OmitUnknowns以剔除unknown类型字段?

实现TypeScript泛型OmitUnknowns剔除unknown类型字段

完全可行,核心是利用TypeScript的键重映射(Key Remapping)和条件类型的双向判断来精准识别unknown类型字段。

实现代码

type OmitUnknowns<T> = {
  [K in keyof T as T[K] extends unknown ? (unknown extends T[K] ? never : K) : K]: T[K]
};

逻辑说明

因为所有类型都满足T[K] extends unknown,所以需要反向判断unknown extends T[K]:

  • 只有当T[K]本身就是unknown时,unknown extends T[K]才会成立,此时将该键映射为never(即从结果类型中剔除)
  • 对于其他类型(如string/number/boolean等),unknown extends T[K]不成立,保留原键

验证示例

interface Foo {
  foo: string;
  bar: number;
  bla: unknown;
  baz: boolean;
}

type T = OmitUnknowns<Foo>;
// 最终T的类型为:{ foo: string; bar: number; baz: boolean; }

补充:处理any类型的情况

如果你的类型中存在any字段,上述逻辑会把any也当成unknown剔除(因为unknown extends any成立)。若需要保留any字段,可以调整条件为:

type OmitUnknowns<T> = {
  [K in keyof T as 
    T[K] extends unknown 
      ? (unknown extends T[K] ? (T[K] extends any ? (any extends T[K] ? never : K) : never) : K) 
      : K
  ]: T[K]
};

这个版本会只剔除严格等于unknown的字段,保留any类型的字段。

内容的提问来源于stack exchange,提问作者DeX3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:32:00