typescript / expert
Snippet
Schreibgeschützte Tupel-Slice-Indexierung für Puffer-Segment-Zugriffe
Dieses Snippet zeigt typbasierte Datenverarbeitung ohne Laufzeitkosten mittels rekursiver Tupel-Zähler. Durch Nachverfolgen von Array-Indizes über die Länge von Akkumulator-Tupeln (`Index['length']`) schneidet TypeScript Teilsegmente fester Tupeltypen exakt zur Kompilierzeit zu.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type TupleSlice<T extends readonly unknown[],Start extends number,End extends number,Acc extends readonly unknown[] = [],Index extends readonly unknown[] = []> = Index["length"] extends End? Acc: Index["length"] extends Start? TupleSlice<T, Start, End, [...Acc, T[Index["length"]]], [...Index, unknown]>: Acc["length"] extends 0? TupleSlice<T, Start, End, Acc, [...Index, unknown]>: TupleSlice<T, Start, End, [...Acc, T[Index["length"]]], [...Index, unknown]>;type ByteHeader = readonly [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];type PNGMagicBytes = TupleSlice<ByteHeader, 0, 4>;
Erklärung
1
type TupleSlice<T extends readonly unknown[], Start extends number, End extends number...>
Defines ein endrekursives Typ-Utility, das Elemente aus Tupel T zwischen Start- und End-Indizes extrahiert.
2
Index["length"] extends End ? Acc
Nutzt den Vergleich der Tupellänge als Typ-Schleifenzähler für die Abbruchbedingung.
3
type PNGMagicBytes = TupleSlice<ByteHeader, 0, 4>;
Schneidet die ersten 4 Magic-Byte-Literaltypen zur Kompilierzeit aus dem ByteHeader-Tupel aus.