无法自动完成泛型类型参数

问题描述 投票:0回答:1

我有这个功能

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
1个回答
0
投票

这是 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"

Playground 代码链接

© www.soinside.com 2019 - 2024. All rights reserved.