Typescript-Typisierung für ein mehrdimensionales Array
Ich erstelle eine Matrix/ein zweidimensionales Array von Booleans und ich möchte einen Typ ableiten, der nicht einfach "ANY" für das Dategrid ist.
let yearRange = [2000,2001,2002,2003,2004];
let monthRange = [0,1,2,3,4,5,6,7,8,9,10,11];
let dateGrid = any;
yearRange.forEach((year) => {
monthRange.forEach((month) => {
dateGrid[year][month] = true;
});
});
Wie erstellt man ein Interface/einen Typ für DateGrid, der:
Leitet die Struktur ab: z.B. dateGrid[yearIndex][possibleMonthValues]:boolean Und beschränkt den Monatsindex nur auf die zutreffenden Monate.
dateGrid[2000][0] = true
dateGrid[2000][1] = true
dateGrid[2000][2] = true
dateGrid[2000][3] = true
dateGrid[2000][4] = true
dateGrid[2000][5] = true
dateGrid[2000][6] = true
dateGrid[2000][7] = true
dateGrid[2000][8] = true
dateGrid[2000][9] = true
dateGrid[2000][10] = true
dateGrid[2000][11] = true
dateGrid[2001][0] = true
... und so weiter ...
Antwort #1
Auf Datensatz basierende Lösung
Um völlig strikt zu sein, können wir die richtigen verengten Typen aus den von Ihnen angegebenen Variablen mithilfe des const-Schlüsselworts ableiten. Da ich annehme, dass Jahre nur ein Beispiel sind, wäre der ideale Ansatz, nur die Monate einzuschränken und die Jahre als number zu belassen:
// use const in order to get proper types
let yearRange = [2000,2001,2002,2003,2004];
let monthRange = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] as const;
type Month = typeof monthRange[number];
let dateGrid: Record <number,Record<Month, boolean>>;
Record<Month, boolean> wird eine gute Idee sein, wenn wir darauf beschränken, alle Monate von 0 bis 11 zu haben. Wenn wir nur einen Teil der Monate im Jahr zulassen, können wir ein nicht-exklusives Record erstellen:
let dateGrid: Record<number, Partial<Record<Month, boolean>>> = {
[2000]: {
"0" : false
}
} // valid as not all fields needs to be provided
const a = dateGrid[2000][4] // boolean | undefined
// in contrary exclusive type
let dateGridExclusive: Record<number, Record<Month, boolean>> = {
[2000]: {
"0" : false
}
} // error all months need to be provided
const b = dateGrid[2000][4] // boolean
Achten Sie darauf, dass ich den Partial-Hilfstyp verwendet habe, um die Einschränkung zu lockern und zu erlauben, dass nur ein Teil der Monate angegeben wird.
Array-basierte Lösung
Wenn wir dies als Array verwenden wollen, können wir einen anderen Array-Typ betrachten:
type Months = [
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
boolean,
]
let dateGrid: Months[] // array of 12 element tuples
Der Nachteil der Verwendung eines Arrays auf Jahresebene ist, dass wir, wenn wir den Startpunkt davon auf 2000 setzen, 1999 undefinierte Werte haben.
