2

我需要一个函数,它改变我的对象中的一个特定变量:

function updateField(fieldname, newValue){
  return {...this.oldObject, fieldname: newValue};
}

我想让它类型安全。fieldName 的类型是typeof clazz,但是 的类型是newValue什么?我知道 Typescripts Pick,所以完全打字会是这样的:

updateField(fieldname: typeof Clazz, newValue: Pick<Clazz, fieldname>): Clazz

但我不知道如何使用非常量字符串。这在TS中甚至可能吗?

4

1 回答 1

2

您可以使用运算符将​​文件名限制为有效的对象键keyof。要获取值类型,您可以使用查找类型T[K],其中T对象类型和K键类型:

const foo = {
    a: 1,
    b: 'some string'
};

function update<T, K extends keyof T>(obj: T, key: K, value: T[K]): T {
    return {
        ...obj,
        [key]: value,
    }
}

update(foo, 'a', 2); // OK
update(foo, 'b', 2); // Error: Argument of type '2' is not assignable to parameter of type 'string'
update(foo, 'c', 2); // Error: Argument of type '"c"' is not assignable to parameter of type '"a" | "b"'

操场

于 2019-11-18T13:34:52.030 回答