TypeScript:尝试使用字符串时,索引签名参数必须是 'string' 或 'number'数字
TypeScript: An index signature parameter must be a 'string' or 'number' when trying to use string | number
我正在尝试创建一个函数来规范化我的数组,它需要一个结构如下的输出对象:
{
allIds: [1],
byId: {
1: {...}
}
}
或
{
allIds: ['1'],
byId: {
'1': {...}
}
}
我正在尝试创建一个名为 IOutput
的界面来满足此需求。
我试过这个:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number | string]: any
}
}
但是它给了我以下错误
An index signature parameter type must be 'string' or 'number'. ts(1023)
当我这样做时似乎有效:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number]: any
}
}
或
interface IOutput {
allIds: string[] | number[]
byId: {
[key: string]: any
}
}
但这不是我想要完成的。我也试过这个,它给了我同样的错误:
type StringOrNumber = string | number
interface IOutput {
allIds: string[] | number[]
byId: {
[key: StringOrNumber ]: any
}
}
我怎样才能完成我想做的事情?
这是当前我们编写索引的方式的限制(这将改变 soon enough)。索引签名参数只能是 number
或 string
(正是那些类型,而不是它们的联合,不是文字类型)。但是,您可以有两个索引签名,一个用于 number
,一个用于 string
.
还有一个小quick,如果你有string
签名,其实你也可以用number
索引。所以这意味着如果 string
索引和 number
索引具有相同的 return 类型,你只需要字符串索引
interface IOutput {
allIds: string[] | number[]
byId: {
[key: string]: any
// [key: number]: any // Valid but not necessary
}
}
let o: IOutput = {
allIds: [1],
byId: {
1: {}
}
}
let o2: IOutput = {
allIds: ['1'],
byId: {
'1': {}
}
}
我正在尝试创建一个函数来规范化我的数组,它需要一个结构如下的输出对象:
{
allIds: [1],
byId: {
1: {...}
}
}
或
{
allIds: ['1'],
byId: {
'1': {...}
}
}
我正在尝试创建一个名为 IOutput
的界面来满足此需求。
我试过这个:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number | string]: any
}
}
但是它给了我以下错误
An index signature parameter type must be 'string' or 'number'. ts(1023)
当我这样做时似乎有效:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number]: any
}
}
或
interface IOutput {
allIds: string[] | number[]
byId: {
[key: string]: any
}
}
但这不是我想要完成的。我也试过这个,它给了我同样的错误:
type StringOrNumber = string | number
interface IOutput {
allIds: string[] | number[]
byId: {
[key: StringOrNumber ]: any
}
}
我怎样才能完成我想做的事情?
这是当前我们编写索引的方式的限制(这将改变 soon enough)。索引签名参数只能是 number
或 string
(正是那些类型,而不是它们的联合,不是文字类型)。但是,您可以有两个索引签名,一个用于 number
,一个用于 string
.
还有一个小quick,如果你有string
签名,其实你也可以用number
索引。所以这意味着如果 string
索引和 number
索引具有相同的 return 类型,你只需要字符串索引
interface IOutput {
allIds: string[] | number[]
byId: {
[key: string]: any
// [key: number]: any // Valid but not necessary
}
}
let o: IOutput = {
allIds: [1],
byId: {
1: {}
}
}
let o2: IOutput = {
allIds: ['1'],
byId: {
'1': {}
}
}