Typescript 如何使用隐式键将对象文字声明为记录

Typescript 如何使用隐式键将对象文字声明为记录,typescript,Typescript,如果在未声明类型的情况下创建常量对象文字,它将根据值推断键: const OBJ = {foo: 42, bar: 42} 这将成为一条记录,这意味着IDE将有助于在键入OBJ.fo等时自动完成 如果同一对象是这样声明的: const OBJ: Record<string, number> = {foo: 42, bar: 42} 现在OBJ将成为记录,而不是记录 我想要声明一个字典,其中值的类型在声明中给出,但键是推断出来的 我找到的唯一方法是: 键入每个值 constobj=

如果在未声明类型的情况下创建常量对象文字,它将根据值推断键:

const OBJ = {foo: 42, bar: 42}
这将成为一条
记录
,这意味着IDE将有助于在键入
OBJ.fo
等时自动完成

如果同一对象是这样声明的:

const OBJ: Record<string, number> = {foo: 42, bar: 42}
现在
OBJ
将成为
记录
,而不是
记录

我想要声明一个字典,其中值的类型在声明中给出,但键是推断出来的

我找到的唯一方法是:

  • 键入每个值
  • constobj={foo:A,bar:B};
    
  • 分别声明密钥
  • type key='foo'|'bar';
    const OBJ:Record={foo:A,bar:B};
    

    是否有更好的方法,通过文本推断键,但在整个
    记录上声明值?

    我不确定您使用的是哪个TypeScript版本。另外,您的示例有一个错误,您需要使用
    MyEnum.A
    ,而不仅仅是
    A

    让我们看一下您的示例:

    enum MyEnum {
      A = 42,
      B = 85
    }
    
    const OBJ = {foo: MyEnum.A, bar: MyEnum.B};
    
    OBJ
    的类型正确:
    {foo:MyEnum;bar:MyEnum;}
    。在
    3.9>
    typescript中测试

    试穿


    关于您的要求:

    我想要声明一个字典,其中值的类型在声明中给出,但键是推断出来的

    您可以使用来推断类型:

    enum MyEnum {
      A = 42,
      B = 85
    }
    
    function fixType<T extends string>(value: Record<T, MyEnum>): Record<T, MyEnum> {
      return value
    }
    
    const OBJ = fixType({foo: MyEnum.A, bar: MyEnum.B})
    
    enum MyEnum{
    A=42,
    B=85
    }
    函数类型(值:记录):记录{
    返回值
    }
    const OBJ=fixType({foo:MyEnum.A,bar:MyEnum.B})
    
    现在,
    OBJ
    具有
    记录
    类型

    试穿


    如果您使用的是
    Enum
    ,您可能会对以下内容感兴趣。总之,即使您指定了枚举支持的数字,TS仍然允许分配任何数字

    type Keys = 'foo' | 'bar';
    const OBJ: Record<Keys, MyEnum> = {foo: A, bar: B};
    
    enum MyEnum {
      A = 42,
      B = 85
    }
    
    const OBJ = {foo: MyEnum.A, bar: MyEnum.B};
    
    enum MyEnum {
      A = 42,
      B = 85
    }
    
    function fixType<T extends string>(value: Record<T, MyEnum>): Record<T, MyEnum> {
      return value
    }
    
    const OBJ = fixType({foo: MyEnum.A, bar: MyEnum.B})