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

如何在TypeScript中基于属性值定义类型?修复KeyMapper类型

修复KeyMapper类型以关联targetKey与mapper值类型

问题分析

原KeyMapper类型中,mapper的值类型被定义为T[keyof T],即目标对象所有属性类型的联合类型。这导致即使指定了targetKey为某个具体属性,mapper仍然可以接受其他属性的有效值,无法建立targetKey与mapper值类型的强关联,因此示例中第二个元素的错误赋值不会触发TypeScript报错。

解决方案

通过遍历目标对象的每个属性,为每个属性单独生成对应的KeyMapper子类型,最终取所有子类型的联合。这样每个数组元素必须匹配某个属性对应的targetKey和其有效值类型,实现类型强关联。

修复后的类型定义

type KeyMapper<T extends object> = {
  [K in keyof T]: {
    targetKey: K;
    mapper: {
      [key: string]: T[K];
    };
  };
}[keyof T];

验证示例

使用修复后的类型,原示例中的错误赋值会被TypeScript正确检测:

type ButtonProps = {
  hierarchy: 'primary' | 'secondary' | 'tertiary';
  styleSemantic: 'info' | 'success' | 'alert' | 'warning';
};

const keyMapperArray: KeyMapper<ButtonProps>[] = [
  {
    targetKey: 'hierarchy',
    mapper: {
      filled: 'primary' // 合法,匹配hierarchy类型
    }
  },
  {
    targetKey: 'styleSemantic',
    mapper: {
      error: 'primary' // TypeScript报错:类型'"primary"'不能赋值给类型'"info" | "success" | "alert" | "warning"'
    }
  }
];

内容的提问来源于stack exchange,提问作者Eduardo Alcebíades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:53:14