如何在TypeScript中根据接口键获取对应值类型并构造带类型提示的更新参数类型?
如何在TypeScript中根据接口键获取对应值类型并构造带类型提示的更新参数类型?
当然可以实现!这正是TypeScript类型系统的强项之一,完全能给你想要的那种「输入键就自动提示对应值类型」的效果,刚好适配你的部分更新函数场景。
先回顾你的原始接口:
interface Ifa { A: string; B: number; C: boolean; // 可以继续扩展其他字段 }
我们需要构造一个绑定键与对应值类型的联合元组类型,让TypeScript能在你输入键的时候自动推断出对应的值类型。具体可以这样定义:
type UpdateParam<Obj> = { [K in keyof Obj]: [K, Obj[K]] }[keyof Obj];
我来拆解一下这个类型的工作逻辑:
keyof Obj:先把传入的接口(比如你的Ifa)的所有键提取出来,变成一个联合类型,这里就是"A" | "B" | "C"- 接着用映射类型遍历每个键
K,把每个键和它对应的值类型打包成一个元组[K, Obj[K]]——比如当K是"A"时,元组就是["A", string],K是"B"时就是["B", number] - 最后用
[keyof Obj]去「取出」映射类型里的所有元组,把它们合并成一个联合类型,这样每个元组的键和值类型就牢牢绑定在一起了
接下来,你就可以用这个类型来定义你的部分更新函数了:
function partialUpdate<Obj>(obj: Obj, ...updates: UpdateParam<Obj>[]) { updates.forEach(([key, value]) => { (obj as any)[key] = value; }); return obj; }
现在试试实际调用,你会发现完美的类型提示效果:
const myObj: Ifa = { A: "hello", B: 123, C: true }; // 正确调用:输入键后,自动提示对应值类型 partialUpdate(myObj, ["A", "new string"], ["B", 456]); // 错误调用:TypeScript会直接报错提示 partialUpdate(myObj, ["A", 123]); // 第二个参数应该是string,类型不匹配 partialUpdate(myObj, ["D", "test"]); // 接口里不存在键D,直接报错
这样用户在输入更新参数时,只要第一个元素是接口里的合法键,TypeScript就会自动约束第二个元素必须是对应的值类型,完全满足你的需求。
备注:内容来源于stack exchange,提问作者Avex
相关产品推荐
相关产品推荐

