TypeScriptУрок 12 из 16

Защитники типов: typeof, in, instanceof

Защитник типа — проверка, после которой TypeScript точно знает тип значения. Больше всего они нужны для unknown и данных из внешнего мира.

Главное

  • typeof подходит для примитивов: "string", "number", "boolean".
  • "meow" in pet проверяет наличие свойства и выбирает нужный вариант объединения.
  • instanceof работает с классами: error instanceof ApiError.
  • Предикат value is Contact превращает обычную функцию-проверку в защитника типа.
  • filter с предикатом возвращает массив нужного типа, а не unknown[].

Пример

class ApiError {  constructor(public code: number) {}} interface Cat {  meow(): string;}interface Dog {  bark(): string;} function speak(pet: Cat | Dog): string {  return "meow" in pet ? pet.meow() : pet.bark(); // "in" narrows to Cat} function isText(value: unknown): value is string {  return typeof value === "string"; // a custom type predicate} function explain(error: unknown): string {  if (error instanceof ApiError) return `API error ${error.code}`;  if (isText(error)) return `Message: ${error}`;  return "Unknown error";} console.log(speak({ meow: () => "Meow!" }));console.log(explain(new ApiError(404)));console.log(explain("timeout"));console.log(explain(42));

explain принимает что угодно, но в каждой ветке тип уже известен: у ApiError есть code, а строку можно вставить в текст. Без предиката isText TypeScript не сузил бы unknown до string.

Задание

Как пользоваться редактором⌘ Enter или Ctrl Enter — запустить код, ⇧ ⌘ Enter — проверить задание.Tab и Shift Tab сдвигают строку или выделение; Esc, затем Tab — выйти из редактора.Проверка сравнивает то, что напечатала программа, с заданием; пробелы в конце строк не важны.После двух неудачных проверок можно открыть решение. Ваш код сохраняется в этом браузере.

Превратите isContact в предикат value is Contact с полной проверкой, выведите каждый контакт строкой вида «Ivan: 555-0101», а в конце — «Valid: 2 of 5».

Вывод

Здесь появится то, что напечатает программа.