如何为值类型依赖于键的对象定义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
相关产品推荐
相关产品推荐

