I'm attempting to create a function to normalize my arrays and it's expecting an output object that is structured like this:
{
allIds: [1],
byId: {
1: {...}
}
}
OR
{
allIds: ['1'],
byId: {
'1': {...}
}
}
I'm trying to create an interface called IOutput
to cater for this.
I've tried this:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number | string]: any
}
}
But it gives me the following error
An index signature parameter type must be 'string' or 'number'. ts(1023)
It seems to work when I do this:
interface IOutput {
allIds: string[] | number[]
byId: {
[key: number]: any
}
}
OR
interface IOutput {
allIds: string[] | number[]
byId: {
[key: string]: any
}
}
But that's not what I'm trying to accomplish. I've also tried this and it gives me the same error:
type StringOrNumber = string | number
interface IOutput {
allIds: string[] | number[]
byId: {
[key: StringOrNumber ]: any
}
}
How can I accomplish what I'm trying to do?
Index signature syntax The syntax of an index signature is pretty simple and looks similar to the syntax of a property, but with one difference. Instead of the property name, you simply write the type of the key inside the square brackets: { [key: KeyType]: ValueType } .
In typescript, Index Signature identifies key type for indexing of an object. Everytime an object in typescript is created and indexing is expected on that object then developers must specify Index Signature .
A function signature (or type signature, or method signature) defines input and output of functions or methods. A signature can include: parameters and their types. a return value and type.
Index signature can be used to define the type of the object whose values are of consistent types or you don't know the structure of the object you are dealing with.
This is a limitation of the current way we can write indexes (this will change soon enough). An index signature parameter can only be number
or string
(exactly those types, not a union of them, not literal types). You can however have two index signatures, one for number
and one for string
.
There is another small quick, if you have a string
signature, you can actually index by number
as well. So this means that if the string
index and the number
index have the same return type you just need the string index
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': {}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With