JS对象的TypeScript类型



我正在努力让VS代码建议下面代码片段的键列表。你能帮我拿一下自动钥匙吗?

const myVar : Record<string, string> = {
key1: 'val1',

}
myVar.key2 = "val2",
myVar.key3 = "val3";
myVar. //doesn't populate the keys

您需要实际指定对象中可能的键。正如文档所说,Record不是适合您的类型:

Record<键,Type>

构造一个对象类型,其属性键为keys,属性值为type。此实用程序可用于将一个类型的属性映射到另一个类型。

你可以这样做:

interface MyInterface {
key1: string;
key2: string;
key3: string;
}
const myVar : MyInterface = {
key1: 'val1',
key2: '',
key3: '',
}
myVar.key2 = "val2":
myVar.key3 = "val3";

一般来说,typescript不跟踪突变。除了这种情况。除此之外,一旦您为myVar(我的意思是Record<...>)定义了显式类型,TS将不会为您推断任何属性,除非您使用satisfies操作符。

但是,如果您希望为myVar使用显式类型Record<string, string>,并且希望对其进行修改,则可以考虑使用断言函数

const myVar: Record<string, string> = {
key1: 'val1',
}
myVar.key2 = "val2",
myVar.key3 = "val3";
function mutate<
Obj extends { [prop: string]: string },
Key extends string,
Value extends string
>(obj: Obj, key: Key, value: Value): asserts obj is Obj & Record<Key, Value> {
Object.assign(obj, { [key]: value })
}
mutate(myVar, 'key1', 'val2')
myVar.key1 // val2

游乐场

我强烈建议你避免在打字稿中修改。TS不喜欢,请看我的文章

最新更新