如何实现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
相关产品推荐
相关产品推荐

