我有这个功能
function updateProperty<T, K extends keyof T>(obj: T, key: K, value: T[K]): void {
obj[key] = value;
}
我有这个接口和对象:
interface ExampleObject {
a: boolean;
b: number;
c: string;
}
const example: ExampleObject = { a: false, b: 10, c: 'Hello' };
我正在调用这个函数:
updateProperty<ExampleObject, 'a'>(example, 'a', true);
updateProperty<ExampleObject, 'b'>(example, 'b', 20);
updateProperty<ExampleObject, 'c'>(example, 'c', 'World');
我的代码没有问题,并且类型验证正确,但是,我缺少 vscode 中针对
K
类型的泛型类型参数的自动完成功能。
换句话说,在编写这些内容时,我没有获得该字段的自动完成功能:
updateProperty<ExampleObject, 'a'>(e...
👆
这是 TypeScript 缺少的功能,如 microsoft/TypeScript#28662 中所要求的。这是一个相当长期的功能请求,并且似乎没有太多社区支持(只有几十个赞成票),因此不太可能很快实现。 现在你要么需要忍受它,要么解决它。
到目前为止,示例代码最简单的解决方法是不手动指定generic类型参数。让 TypeScript infer 它们,这是迄今为止泛型函数调用最常见的方式:
updateProperty(example, 'a', true);
// T inferred as ExampleObject, K inferred as "a"
尽管
K
不提供自动完成功能,但 key
可以:
updateProperty(example, |
// ^ 🔧 "a"
// ^ 🔧 "b"
// ^ 🔧 "c"