TypeScript如何将any/unknown类型属性映射为泛型类型T
TypeScript 实现any/unknown属性映射为指定泛型的方案
你的思路是对的,核心是通过映射类型遍历原对象属性,搭配自定义类型判断逻辑识别any/unknown类型后做替换,具体实现如下:
前置类型判断工具
TS没有内置的any/unknown类型判断能力,需要利用类型系统特性自行实现:
IsAny:利用any的特殊交叉特性判断,只有any和任意类型交叉后仍为any,满足0 extends any的规则,不会和其他类型产生误判
type IsAny<T> = 0 extends (1 & T) ? true : false;
IsUnknown:unknown是顶层类型,只有any和unknown满足unknown extends T,排除掉any的场景后即可精准识别unknown
type IsUnknown<T> = unknown extends T ? IsAny<T> extends true ? false : true : false;
核心映射类型
遍历原类型的所有键,对属性值做判断,是any/unknown就替换为传入的泛型T,其余属性保留原有类型:
type ReplaceAnyUnknown<Source extends object, T> = { [Key in keyof Source]: IsAny<Source[Key]> extends true ? T : IsUnknown<Source[Key]> extends true ? T : Source[Key] };
用法示例
对应你给出的场景,直接传入非泛型原类型即可生成需要的泛型结构:
// 原非泛型类型定义 type TypeNonGeneric = { prop1: any, prop2: string }; // 生成目标泛型类型 type TypeGeneric<T> = ReplaceAnyUnknown<TypeNonGeneric, T>; // 类型验证:TypeGeneric<number> 的结构为 { prop1: number, prop2: string },完全匹配预期
补充说明:如果属性是包含any/unknown的联合类型(比如
prop: string | unknown),该工具也会识别并替换,和TS原生类型分发逻辑保持一致。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

