【发布时间】:2017-10-21 23:31:17
【问题描述】:
...component.ts (..,..) 中的错误:类型中的计算属性名称 literal 必须直接引用内置符号。 ...: 找不到 命名为“任何”。
我期待一个对象,其中包含具有其他字符串的字符串,即:
{ abc: 'xyz' }
我做了什么:
foo: { [string]: string };
【问题讨论】:
标签: typescript
...component.ts (..,..) 中的错误:类型中的计算属性名称 literal 必须直接引用内置符号。 ...: 找不到 命名为“任何”。
我期待一个对象,其中包含具有其他字符串的字符串,即:
{ abc: 'xyz' }
我做了什么:
foo: { [string]: string };
【问题讨论】:
标签: typescript
计算值上的标识名称是必需的:
foo: { [bar: string]: string };
【讨论】:
我在构建后遇到了类似的问题。我面临的两个问题是使用数字和/或枚举值作为对象中的键。只是为了帮助那些将来看到这一点的人。
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;
};
所以两个可能的修复是......
someMap
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访问值应该无关紧要,因为打字稿无论如何都会将其强制转换为字符串,但可能最适合整体一致性。const valueOne: string = someMap[ CONSTANT_ONE ]; // vs const valueOne: string = someMap[ `${CONSTANT_ONE}` ];
【讨论】:
如果密钥类型来自泛型,currently accepted 答案将不起作用。为此,您需要使用 in 运算符:
type WithKey<K extends string | number | symbol> = {
[k in K]: boolean
}
【讨论】: