在打字稿中使用可变字符串

Using variable string in typing in Typescript

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

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 中甚至可能吗?

您可以使用 keyof 运算符将文件名限制为有效的对象键。要获取值类型,您可以使用 lookup 类型 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"'

Playground