首页 > 解决方案 > 基于键检查值的对象设置器函数

问题描述

例如我有一个像这样的对象:

interface Test{
   a: number;
   b: string;
   c: boolean;
}

const obj:Test = {
   a: 1,
   b: '1',
   c: true,
}

我想做一个可以改变对象内容的函数,但是值是根据键来检查的。我可以像这样得到getter,但我一直在制作setter:


function getValue<T , U = keyof T>(obj: T, key: U){
   return obj[key]
}

function setValue<T , U = keyof T, V???????>(obj: T, key: U, value: V>{
   obj[key] = value
}

所以如果我这样做:

setValue(obj,'a',1) // no error
setValue(obj,'b',1) // typecheck error

标签: typescript

解决方案


您不需要第三个泛型 - 您可以使用T[U],因为 T 和 U 都是由该点定义的。

function getValue<T, U extends keyof T>(obj: T, key: U){
   return obj[key]
}

function setValue<T, U extends keyof T>(obj: T, key: U, value: T[U]){
   obj[key] = value
}

setValue(obj,'a',1) // no error
setValue(obj,'b',1) // typecheck error

推荐阅读