Type Guards: isDefined, isString, isOneOf
Schreib drei Prüfungen, nach denen TypeScript den Typ des Werts verengt.
isDefined(value): nicht null und nicht undefined; [1, null, 2].filter(isDefined) soll number[] ergeben, und 0 und "" sind ebenfalls Werte. isString(value): ein String. isOneOf(values) liefert eine Prüfung auf einen der aufgeführten Werte: nach isOneOf(["red", "green"] as const)(c) ist der Typ von c gleich "red" | "green".
Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (6)
Typtests prüft der TypeScript-Compiler im strict-Modus. Expect<Equal<A, B>> besteht, wenn die Typen exakt gleich sind, und // @ts-expect-error, wenn die nächste Zeile nicht kompiliert. Der erste Start lädt den Compiler und dauert daher ein paar Sekunden.
- Typen
const xs = [1, null, 2, undefined].filter(isDefined); type _ = Expect<Equal<typeof xs, number[]>>;
- Typen
const v: unknown = 'x'; if (isString(v)) { type _ = Expect<Equal<typeof v, string>>; }
- Typen
const isColor = isOneOf(['red', 'green'] as const); const c: unknown = 'red'; if (isColor(c)) { type _ = Expect<Equal<typeof c, 'red' | 'green'>>; }
expect([1, null, 2, undefined, 0, ''].filter(isDefined)).toEqual([1, 2, 0, '']);
expect(isString('a')).toBe(true); expect(isString(1)).toBe(false); expect(isString(null)).toBe(false);
const isColor = isOneOf(['red', 'green']); expect(isColor('red')).toBe(true); expect(isColor('blue')).toBe(false);