TypeScript类型文字中的计算属性名称必须直接引用内置符号

时间:2017-05-22 10:31:45

标签: typescript

  

ERROR in ... component.ts(..,..):类型中的计算属性名称   文字必须直接引用内置符号。 ...: 找不到   姓名'任何'。

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

{ abc: 'xyz' }

我做了什么:

foo: { [string]: string };

3 个答案:

答案 0 :(得分:8)

需要计算值的识别名称:

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

答案 1 :(得分:3)

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

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

currently accepted

答案 2 :(得分:1)

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

枚举作为键

d

这会将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;
};

所以有两个可能的解决方法...

1)将显式类型分配给export declare const someMap: { [ x: string ]: string; };

someMap

2)将export interface ForceStringType { [product: string]: string; } export const someMap: ForceStringType = { [ MyEnum.one ]: 'valueOne', [ MyEnum.two ]: 'valueTwo', }; 类型分配给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