打字稿索引签名参数类型必须为“字符串”或“数字”

时间:2020-05-05 12:21:06

标签: typescript

我有一个通用类型,其默认类型为string

interface EntityState<typeOfID = string> {
  entities: { [ id: typeOfID]: any };
}

我得到了错误:

An index signature parameter type must be either 'string' or 'number'.(1023)

我还尝试了以下方法:

interface EntityState<typeOfID extends string | number> {
  entities: { [ id: typeOfID]: any };
}

它不起作用。如何解决?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用Record

考虑一下:

export const enum MyEnumKeys {
  Key1 = 'key1',
}

interface EntityState<typeOfID> {
  entities: Record<typeOfID, any>;
}

const test: EntityState<MyEnumKeys> = {
  entities: {
    key1: 1,
    anotherKey: 2 // error here
  }
}

答案 1 :(得分:0)

在JavaScript(也就是TypeScript)中,对象键始终是字符串或Symbol 这就是TypeScript试图告诉您的:除了这些键之外,您不能将键的类型设置为其他任何类型。

From Mozilla's Developer Docs:

请注意,除非它们是符号,否则方括号符号中的所有键都将转换为字符串,因为JavaScript对象属性名称(键)只能是字符串或符号(有时,私有名称也将添加为字符串)。类字段提案的进度,但您不会将它们与[]表单一起使用)。例如,在上面的代码中,将键obj添加到myObj时,JavaScript将调用obj.toString()方法,并将此结果字符串用作新键。

在第一个示例中,您说的是密钥类型几乎可以是任何东西,但通常是字符串。这样就可以使用布尔值,这是不允许的。

在第二个示例中,您说的是密钥类型是字符串和数字的超集。仍然不允许这样做,因为类型仍然不能保证它们是可字符串化的。 (即null,通常具有typeof(null)==“ object”,但不能转换为字符串。)

编辑:Numbers are also allowed,因为可以保证它们能够转换为字符串。可串化的正确术语是可索引的。

编辑2:尽管JavaScript允许将Symbol用作键,但TypeScript当前不允许。您可以阅读始于2015年TypeScript's GitHub Repository

的讨论