如何在函数参数中绑定类型

时间:2018-07-04 16:24:30

标签: typescript generics

是否可以在函数中基于另一个参数检查一个参数的类型?有一个例子:

interface Data {
  id?: number;
  name?: string;
}

let data : Data = {};

// have no idea how to strict "value" argument
function update(field : keyof Data, value) {
  data[field] = value;
}

update('id', 0);             // [1] ok
update('name', 'foo');       // [2] ok
update('id', 'some string'); // [3] FAIL ("id" must be a number)
update('name', 123);         // [4] FAIL ("name" must be a string)
update('other', 123);        // [5] FAIL ("other" isn't possible argument)

我不确定是否可以这样做。在该示例中,仅呼叫号码[5]将失败。

1 个答案:

答案 0 :(得分:3)

添加可以是Data的任意键的泛型,然后使用Data[K]获得K的类型。

function update<K extends keyof Data>(field: K, value: Data[K]) {
   data[field] = value;
}

使用1和2进行编译,使用3、4和5进行编译时会出错。