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

如何为值类型依赖于键的对象定义TypeScript类型

TypeScript键值关联的对象类型定义

给定如下基础类型:

type Mapping = {
  "string": string;
  "number": number;
  "boolean": boolean;
};

需要创建一个对象类型,其键与Mapping的键完全一致,每个键对应的值是一个函数,且该函数的第一个参数类型必须匹配Mapping中对应键的值类型。

原实现的问题

你之前的写法会导致函数参数被推断为string | number | boolean联合类型,无法精准匹配对应键的类型:

type Property<K extends keyof Mapping> = Record<K, (value: Mapping[K]) => void>;
type Obj = Partial<Property<keyof Mapping>>;

这是因为当K传入keyof Mapping联合类型时,Mapping[K]会解析为所有值类型的联合,最终生成的每个函数参数都变成了联合类型,TypeScript无法区分单个键对应的具体参数类型。

正确实现方式

使用**映射类型(Mapped Types)**可以直接遍历Mapping的每个键,为每个键生成严格对应的函数类型:

type Mapping = {
  "string": string;
  "number": number;
  "boolean": boolean;
};

// 直接生成可选的键值关联类型
type Obj = {
  [K in keyof Mapping]?: (value: Mapping[K]) => void;
};

const a: Obj = {
  boolean: (value) => {
    // value被正确推断为boolean类型
    console.log(value);
  },
  string: (value) => {
    // value被正确推断为string类型
    console.log(value.toUpperCase());
  }
};

如果你想先定义完整的必选类型再转为可选,也可以拆分两步:

// 先定义所有键为必选的函数映射类型
type FunctionMapping = {
  [K in keyof Mapping]: (value: Mapping[K]) => void;
};

// 转为可选类型
type Obj = Partial<FunctionMapping>;

两种写法效果一致,都能让TypeScript准确推断每个函数的参数类型,匹配对应键在Mapping中的值类型。

内容的提问来源于stack exchange,提问作者Heloi Neto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:50:28