typescript - Hur definierar man ett gränssnitt för objekt med dynamiska nycklar?
Jag har ett objekt som detta som skapas av underscorens _.groupBy()-metod.
myObject = {
"key" : [{Object},{Object2},{Object3}],
"key2" : [{Object4},{Object5},{Object6}],
...
}
Hur skulle jag definiera det som ett Interface med TypeScript? Jag vill inte bara definiera det som myObject:Object={ ... utan snarare ha en egen typ för det.
Svar #1
Ditt objekt ser ut som en ordbok av Object-arrayer
interface Dic {
[key: string]: Object[]
}
Typescript-litteraturen hänvisar ofta till detta mönster som "beskrivningen av ett indexerbart objekt" med en generell form
interface Dic {
[key: string|number]: object_type
}
eller
type Dic = {
[key: string|number]: object_type
}
Svar #2
Det finns nu en dedikerad Record-typ i TypeScript:
const myObject: Record<string, object[]> = { ... }
Tänk också på att trycka på tangenterna när det är möjligt:
type MyKey = 'key1' | 'key2' | ...
const myObject: Record<MyKey, object[]> = { ... }
Svar #3
{ [x: string]: T }
och
Record<string, T>
vanligtvis kommer att fungera för alla dina mål. Men jag kom till en konstig punkt där efter vissa typer av operationer den första optionen gav mig både [x: string] och [x: number], och jag kunde inte använda Record, eftersom det var en rekursiv typoperation och Typescript kastade ett fel som sa att min rekursiva typ inte var generisk.
Så, genom att studera den riktigt lilla Record-koden, kom jag fram till denna lösning som löste mitt komplexa problem:
{ [P in string]: T }
Redigera: Jag har det här också vanligtvis i varje Typescript-kod jag skriver, i en utils.ts-fil:
export type obj<T = unknown> = Record<string, T>
Snabbare och renare än att använda Spela in hela tiden.
T.ex.:
type MyObjectType = {
propA: obj; // An object with unknown props
propB: obj<number>; // An object with number props
}
