Модуль 13 · Урок 51
Typed functions, generics, unknown і migration
External response входить як unknown і стає trusted type лише після runtime guards. Generic цінний, коли зберігає реальний type relationship, а не приховує any за літерою T.
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.
Офіційні джерела
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.