具有特定类型键的Typescript对象(以及工作的intellisense)

68bkxrlz  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(125)

我试图输入一个对象,使它的键都是一个特定的类型,但在这样一种方式下,我仍然得到intellisense当我访问的主要对象。

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

const TEST: ObjectWithKeysOf<number> =
{
    prop1: 1,
    prop2: 2
};

鉴于上述情况,我希望下面的代码能够正常工作,但是它没有工作。Intellisense不建议将prop1作为属性,并且代码无法编译。

const aNumber = TEST.prop1;

这可能吗?

qzlgjiam

qzlgjiam1#

您可以使用satisfies运算子(在TypeScript v 4.9中引入)来限制型别,同时保留其特定信息(包括IntelliSense自动完成):
在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) */

相同的示例,但结合了constAssert:
TSPlayground

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>

相关问题