Модуль 13 · Урок 51

Typed functions, generics, unknown і migration

External response входить як unknown і стає trusted type лише після runtime guards. Generic цінний, коли зберігає реальний type relationship, а не приховує any за літерою T.

Function contractPromise<T>unknownGenerics

Runtime boundary

function validateBooks(value: unknown): readonly Book[] {
  if (!Array.isArray(value)) return [];
  return value.filter(isBook);
}

async function loadBooks(): Promise<readonly Book[]> {
  return validateBooks(await response.json());
}

unknown вимагає narrowing; any вимикає checks і поширюється далі. Type predicate має чесно відповідати runtime implementation. Promise type описує fulfillment, але rejection policy документується окремо.

Generics і constraints

function first<T>(items: readonly T[]): T | undefined {
  return items[0];
}

function lengthOf<T extends { length: number }>(value: T) {
  return value.length;
}

Type parameter має з’єднувати input/output або кілька positions. Unused T не дає користі; constraint дозволяє лише потрібну capability. Починайте migration з boundaries, тримайте ledger assertions/suppressions і видаляйте їх малими verified кроками.

Лабораторна

Пройдіть valid/invalid unknown fixtures, strict diagnostics, generic cases і migration ledger; виконайте check→build→runtime та зафіксуйте, що emitted JS не містить type annotations і все одно потребує validator.

Завантажити TypeScript lab →

Офіційні джерела

Практична перевірка · урок 51 з 60

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Який type для untrusted external value?
2. Чому any ризиковий?
3. Коли unknown стає Book?