Skip to main content
Практика завдань

Утилітарний тип nonnullable в TypeScript

Що таке NonNullable?

NonNullable<T> створює тип, виключаючи null та undefined з T. Це гарантує, що значення обов'язково присутнє.


Основне використання

typescript
type MaybeString = string | null | undefined; type DefiniteString = NonNullable<MaybeString>; // string type MaybeNumber = number | null; type DefiniteNumber = NonNullable<MaybeNumber>; // number type Complex = string | number | null | undefined | boolean; type Cleaned = NonNullable<Complex>; // string | number | boolean

Як це працює всередині

typescript
// NonNullable визначається як: type NonNullable<T> = T & {}; // Або еквівалентно: type NonNullable<T> = T extends null | undefined ? never : T;

Практичні випадки використання

Параметри функцій

typescript
function processUser(user: NonNullable<User | null>): void { // user гарантовано є User, ніколи не null console.log(user.name); } // Еквівалентно: function processUser(user: User): void { }

Фільтрація масивів

typescript
const items: (string | null | undefined)[] = ["a", null, "b", undefined, "c"]; // Фільтр видаляє null, але TypeScript не звужує автоматично const filtered = items.filter(Boolean); // все ще (string | null | undefined)[] // ✅ Використовуйте NonNullable для правильного типізування const filtered = items.filter((item): item is NonNullable<typeof item> => item != null); // string[] // Або простіше: const filtered: string[] = items.filter((item): item is string => item != null);

Витягування з необов'язкових властивостей

typescript
interface User { id: string; name: string; email?: string; // string | undefined phone?: string | null; // string | null | undefined } type RequiredEmail = NonNullable<User["email"]>; // string type RequiredPhone = NonNullable<User["phone"]>; // string

Генеричні обмеження

typescript
function getValue<T>(value: T): NonNullable<T> { if (value == null) { throw new Error("Значення не може бути null або undefined"); } return value as NonNullable<T>; } const result = getValue<string | null>("hello"); // result: string (не string | null)

З іншими утилітними типами

typescript
// Зробити всі властивості обов'язковими І не-null type Strict<T> = { [K in keyof T]-?: NonNullable<T[K]>; }; interface Config { host?: string | null; port?: number; debug?: boolean; } type StrictConfig = Strict<Config>; // { host: string; port: number; debug: boolean }

Важливо:

NonNullable<T> є суттєвим для безпечного оброблення null. Використовуйте його для видалення null/undefined з типів, особливо при роботі з необов'язковими властивостями, API-відповідями або фільтрацією масивів. Він добре поєднується з суворими перевірками на null (strictNullChecks: true).

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань