Schnittstelle für dynamischen Schlüssel im Typoskript


77

Ich habe ein Objekt wie dieses, das mit der _.groupBy()Methode des Unterstrichs erstellt wurde .

myObject = {
  "key" : [{Object},{Object2},{Object3}],
  "key2" : [{Object4},{Object5},{Object6}],
  ...
}

Wie würde ich das als Schnittstelle mit TypeScript definieren? Ich möchte es nicht einfach als definieren, myObject:Object = { ...sondern einen eigenen Typ dafür haben.


Haben die verschiedenen ObjectXeinen Typ oder sind sie nur any?
Nitzan Tomer

Antworten:


182

Ihr Objekt sieht aus wie ein Wörterbuch von ObjectArrays

interface Dic {
    [key: string]: Object[]
}

Fehler TS1023: Ein Indexsignaturparametertyp muss entweder 'string' oder 'number' sein.
Basickarl

44

Es gibt jetzt einen dedizierten RecordTyp in TypeScript:

const myObject: Record<string, object[]> = { ... }

Ziehen Sie außerdem in Betracht, die Tasten nach Möglichkeit einzugeben:

type MyKey = 'key1' | 'key2' | ...

const myObject: Record<MyKey, object[]> = { ... }

2
wenn exportieren gehtexport type MyType = Record<string, object[]>;
galki

2

Ich weiß nichts über die Schnittstelle, für dynamische Objekte können wir ungefähr so ​​vorgehen:

let memoTable: { [k: number]: number } = {};
memoTable[1]=5;
memoTable[2]=7;

2
{ [x: string]: T }

und

Record<string, T>

in der Regel wird für alle Ihre Ziele dienen. Ich kam jedoch zu einem seltsamen Punkt, an dem nach einigen Typoperationen die erste Option sowohl [x: string] als auch [x: number] zu mir zurückkehrte und ich den Datensatz nicht verwenden konnte, da er rekursiv war Typoperation und Typescript gab einen Fehler aus, der besagte, dass mein rekursiver Typ nicht generisch war.

Als ich den wirklich kleinen Record-Code studierte, kam ich zu dieser Lösung, die mein komplexes Problem löste:

{ [P in string]: T }

Bearbeiten: Normalerweise habe ich dies auch in jedem Typescript-Code, den ich schreibe, in einer utils.ts-Datei:

export type obj<T = unknown> = Record<string, T>

Schneller und sauberer als die ständige Verwendung der Aufzeichnung.

Z.B:

type MyObjectType = {
  propA: obj; // An object with unknown props
  propB: obj<number>; // An object with number props
}

1

Anstatt Object als Typ zu verwenden, verwenden Sie Record

interface myObjInterface {
  [key: string]: Record<string, any>[]
}

0

Ich würde eine Lösung mit Map vorschlagen, vielleicht ist es für jemanden nützlich:

type TKey = 'key1' | 'key2' | 'key3';
type TValue = object[];

type TMapper = Map<TKey, TValue>; // But also you can use Record instead of Map
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.