【问题标题】:TypeScript A computed property name in a type literal must directly refer to a built-in symbolTypeScript 类型文字中的计算属性名称必须直接引用内置符号
【发布时间】:2017-10-21 23:31:17
【问题描述】:

...component.ts (..,..) 中的错误:类型中的计算属性名称 literal 必须直接引用内置符号。 ...: 找不到 命名为“任何”。

我期待一个对象,其中包含具有其他字符串的字符串,即:

{ abc: 'xyz' }

我做了什么:

foo: { [string]: string };

【问题讨论】:

    标签: typescript


    【解决方案1】:

    计算值上的标识名称是必需的:

    foo: { [bar: string]: string };
    

    【讨论】:

    【解决方案2】:

    我在构建后遇到了类似的问题。我面临的两个问题是使用数字和/或枚举值作为对象中的键。只是为了帮助那些将来看到这一点的人。

    枚举作为键

    export enum MyEnum {
      one = 'stringOne',
      two = 'stringTwo',
    }
    
    export const someMap = {
      [ MyEnum.one ]: 'valueOne',
      [ MyEnum.two ]: 'valueTwo',
    };
    

    这会将someMap 转换为类似于...的类型

    export declare const someMap: {
      [ MyEnum.one ]: string;
      [ MyEnum.two ]: string;
    };
    

    请注意,键仍然是枚举值而不是字符串,typescript/angular 不喜欢这样,因为它期待类似...

    export declare const someMap: {
      [ x: string ]: string;
    };
    

    所以两个可能的修复是......

    1) 将显式类型分配给someMap

    export interface ForceStringType {
      [product: string]: string;
    }
    export const someMap: ForceStringType = {
      [ MyEnum.one ]: 'valueOne',
      [ MyEnum.two ]: 'valueTwo',
    };
    

    2) 将string 类型分配给someMap 的键

    export const someMap: ForceStringType = {
      [ MyEnum.one as string ]: 'valueOne',
      [ MyEnum.two as string ]: 'valueTwo',
    };
    

    数字作为键

    const CONSTANT_ONE = 123;
    const CONSTANT_TWO = 321;
    
    export const someMap = {
      [ CONSTANT_ONE ]: 'valueOne',
      [ CONSTANT_TWO ]: 'valueTwo',
    };
    

    这会将someMap 转换为类似于...的类型

    export declare const someMap: {
      [ CONSTANT_ONE ]: string;
      [ CONSTANT_TWO ]: string;
    };
    

    请注意,键仍然是常量/数值而不是字符串,打字稿/角度再次期待...

    export declare const someMap: {
      [ x: string ]: string;
    };
    

    所以一种可能的解决方法是......

    someMap的每个键插入数字作为字符串

    export declare const someMap: {
      [ `${CONSTANT_ONE}` ]: string;
      [ `${CONSTANT_TWO}` ]: string;
    };
    

    注意:使用常量/数字作为键从someMap 访问值应该无关紧要,因为打字稿无论如何都会将其强制转换为字符串,但可能最适合整体一致性。

    const valueOne: string = someMap[ CONSTANT_ONE ];
    // vs
    const valueOne: string = someMap[ `${CONSTANT_ONE}` ];
    

    【讨论】:

      【解决方案3】:

      如果密钥类型来自泛型,currently accepted 答案将不起作用。为此,您需要使用 in 运算符:

      type WithKey<K extends string | number | symbol> = {
          [k in K]: boolean
      }
      

      Credit here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-30
        • 2021-08-31
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多