typescript / expert
Snippet
Rekursive Syntaxvalidierung von Vorlagen-Literalen zur Typ-Kompilierzeit
Template-Literal-Typen können strukturierte DSL-Strings rein zur Kompilierzeit parsen und validieren. Durch rekursives Extrahieren von Zeichensegmenten mittels infer prüft TypeScript lexikalische Regeln ohne Speicherallokation zur Laufzeit.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type ValidIdentifier<S extends string> =S extends `${infer First}${infer Rest}`? First extends 'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'? ValidIdentifier<Rest> extends true ? true : false: false: true;type StrictSqlQuery<T extends string> =T extends `SELECT ${infer Cols} FROM ${infer Table}`? ValidIdentifier<Table> extends true? { table: Table; columns: Cols }: never: never;type Parsed = StrictSqlQuery<"SELECT id FROM users">;
Erklärung
1
S extends `${infer First}${infer Rest}`
Spaltet ein Template-Literal in sein erstes Zeichen (First) und den Rest (Rest) auf.
2
First extends 'a'|'b'|...|'z'
Prüft, ob das extrahierte erste Zeichen den Zeichenersetzungsregeln für Bezeichner entspricht.
3
T extends `SELECT ${infer Cols} FROM ${infer Table}`
Gleicht ein Zeichenkettenliteral mit einer erwarteten SQL-Anweisungsstruktur ab.
4
type Parsed = StrictSqlQuery<"SELECT id FROM users">;
Wird zur Kompilierzeit zu einem Objekttyp `{ table: "users"; columns: "id" }` ausgewertet.