如何定义基于Person接口键值类型约束的Mapper类型?
如何定义匹配Person属性类型的Mapper类型
首先给出正确的Mapper类型定义,它能确保每个属性对应的转换函数返回值严格匹配Person接口中对应属性的类型:
type Mapper = Partial<{ [K in keyof Person]: (value: unknown) => Person[K]; }>;
关键说明:
[K in keyof Person]是TypeScript的映射类型,会遍历Person接口的所有属性键,为每个键生成对应的函数类型。Partial<>允许我们只定义需要转换的属性(比如示例中的created),无需覆盖Person的全部属性。- 函数参数用
unknown是因为JSON解析后的原始值类型不确定,你可以根据实际情况添加类型断言(比如把v断言为string来创建Date)。
完整使用示例:
export interface Person { name: string; age: number; created: Date; // 其他属性... } type Mapper = Partial<{ [K in keyof Person]: (value: unknown) => Person[K]; }>; // 定义需要转换的属性映射 const deserializeMap: Mapper = { created: (v) => new Date(v as string), // 若需要转换其他属性,比如把字符串类型的age转为数字: // age: (v) => Number(v) as Person['age'] }; // 结合JSON.parse的reviver实现类型转换 function parsePerson(jsonStr: string): Person { return JSON.parse(jsonStr, (key, value) => { // 检查当前键是否在转换映射中,存在则执行转换 if (key in deserializeMap) { return deserializeMap[key as keyof Person](value); } // 无转换规则则返回原始值 return value; }) as Person; }
为什么你之前的写法不生效?
你尝试的泛型对象类型写法{ <K extends keyof Person >K: ... }是语法错误,TypeScript不支持这种直接在对象类型中绑定泛型参数的写法。正确的思路是用映射类型遍历目标接口的键,为每个键生成匹配的函数类型。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

