带有特定类型键的Typescript对象(和工作智能感知)



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

interface ObjectWithKeysOf<T>
{
[key: string]: T;
}
const TEST: ObjectWithKeysOf<number> =
{
prop1: 1,
prop2: 2
};

鉴于上述情况,我希望下面的方法可以工作,但它没有。智能感知不建议将prop1作为属性,代码无法编译。

const aNumber = TEST.prop1;

这可能吗?

你可以使用在TypeScript v4.9中引入的satisfies操作符来约束一个类型,同时保留它的细节(包括智能感知自动补全):

在TS Playground中试用:

const test = {
prop1: 1,
prop2: 2,
} satisfies Record<string, number>;
test.prop1;
//^? (property) prop1: number
test.prop2;
//^? (property) prop2: number
test.prop3; /*
~~~~~
Property 'prop3' does not exist on type '{ prop1: number; prop2: number; }'. Did you mean 'prop1'?(2551) */

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

TS操场

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

参见类型实用程序Record<Keys, Type>

最新更新