← Усі задачіTypeScript · Middle
Type guards: isDefined, isString, isOneOf
Напишіть три перевірки, після яких TypeScript звужує тип значення.
isDefined(value) - не null і не undefined; [1, null, 2].filter(isDefined) має давати number[], а 0 і "" - це теж значення. isString(value) - рядок. isOneOf(values) повертає перевірку на одне зі значень списку: після isOneOf(["red", "green"] as const)(c) тип c - "red" | "green".
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (6)
Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.
- типи
const xs = [1, null, 2, undefined].filter(isDefined); type _ = Expect<Equal<typeof xs, number[]>>;
- типи
const v: unknown = 'x'; if (isString(v)) { type _ = Expect<Equal<typeof v, string>>; }
- типи
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);