Утилітарний тип 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.