具有特定类型键的 Typescript 对象(以及工作智能感知)

Mad*_*unk 1 intellisense types typescript

我正在尝试输入一个对象,以便它的键都是特定类型,但这样当我访问主对象时我仍然可以获得智能感知。

interface ObjectWithKeysOf<T>
{
    [key: string]: T;
}

const TEST: ObjectWithKeysOf<number> =
{
    prop1: 1,
    prop2: 2
};
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,我希望以下内容能够发挥作用,但事实并非如此。智能感知不建议prop1作为属性,并且代码无法编译。

const aNumber = TEST.prop1;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

jse*_*ksn 5

您可以使用TypeScript v 中引入的satisfies运算符 \xe2\x80\x944.9运算符\xe2\x80\x94 来约束类型,同时保留其细节(包括 IntelliSense 自动完成):

\n

在TS Playground中尝试一下

\n
const test = {\n    prop1: 1,\n    prop2: 2,\n} satisfies Record<string, number>;\n\ntest.prop1;\n   //^? (property) prop1: number\n\ntest.prop2;\n   //^? (property) prop2: number\n\ntest.prop3; /*\n     ~~~~~\nProperty \'prop3\' does not exist on type \'{ prop1: number; prop2: number; }\'. Did you mean \'prop1\'?(2551) */\n\n
Run Code Online (Sandbox Code Playgroud)\n
\n

相同的示例,但结合了const断言

\n

TS游乐场

\n
const test = {\n    prop1: 1,\n    prop2: 2,\n} as const satisfies Record<string, number>;\n\ntest.prop1;\n   //^? (property) prop1: 1\n\ntest.prop2;\n   //^? (property) prop2: 2\n\ntest.prop3; /*\n     ~~~~~\nProperty \'prop3\' does not exist on type \'{ readonly prop1: 1; readonly prop2: 2; }\'. Did you mean \'prop1\'?(2551) */\n\n
Run Code Online (Sandbox Code Playgroud)\n
\n

另请参阅类型实用程序Record<Keys, Type>

\n