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

如何定义基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:12:24