在打字稿中使用可变字符串
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"'
我需要一个函数,它可以改变我的对象中的特定变量:
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"'