Шаблони дженериків, до яких ви сягаєте найчастіше, згруповані за завданням: оголосити параметр типу, обмежити його, дати типове значення, розгалужитися умовою, захопити через infer і відобразити форму. Кожен рядок поєднує шаблон з однорядковим прикладом.
Дженерик — це параметр типу: заповнювач для типу, який обирає викликач, тож одна функція або тип працює для багатьох форм без втрати точності. Читайте <T> як «для деякого типу T». Сила походить з обмеження T, розгалуження на ньому та відображення його. Шаблони нижче — це робочий словник.
Довідкова таблиця · 28 записи
Дженерики TypeScriptExplained
28 of 28 rows
Оголошення
Параметр типу, який обирає викликач.
function first<T>(xs: T[]): T
Кілька незалежних параметрів типу.
function pair<T, U>(a: T, b: U): [T, U]
Другий параметр, прив'язаний до ключів першого.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Клас із параметром типу для його полів і методів.
class Box<T> { value: T }
Форма об'єкта з параметром типу.
interface Result<T> { data: T }
Параметр типу у стрілковій функції; кінцева кома не дає файлам .tsx прочитати його як JSX.
const first = <T,>(xs: T[]): T => xs[0]
Обмеження
Вимагає, щоб T був привласнюваним до Type.
function len<T extends { length: number }>(x: T)
Обмежує T ключем іншого типу.
type Keys<O> = keyof O
Обмежує T конструйованим класом.
function make<C extends new () => C>(c: C): C
Вимагає, щоб T задовольняв кілька обмежень одночасно.
function log<T extends Error & { code: number }>(e: T)
Обмежує чим завгодно; тримає параметр дженериком, не звужуючи його.
type Wrap<T> = T extends unknown ? { v: T } : never
Типове значення & infer
Дає T типове значення, коли викликач його пропустив.
function parse<T = string>(): T
Захоплює тип усередині умовного типу.
type El<T> = T extends Array<infer I> ? I : never
Розгортає вкладений Promise до його внутрішнього типу.
type Data = Awaited<Promise<User>>
Захоплює частину типу шаблонного літерала.
type Path<S> = S extends `/api/${infer R}` ? R : never
Перевіряє весь об'єднаний тип одразу; голий T виводить по одному члену за раз.
type El<T> = [T] extends [Array<infer I>] ? I : never
Умовні & відображення
Обирає тип залежно від того, чи привласнюваний T до U.
type IsStr<T> = T extends string ? true : false
Будує новий тип об'єкта, перетворюючи кожен ключ T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Об'єкт, чиї ключі — K, а значення — V.
type Scores = Record<string, number>
Вбудовані дженерики, похідні від шаблонів вище.
type Preview = Pick<User, "id" | "name">
Голий T перед extends виконується по одному разу для кожного члена об'єднання та об'єднує результати.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Додає або прибирає модифікатори на відображених ключах.
type Req<T> = { [K in keyof T]-?: T[K] }
Ключі значення часу виконання, як тип.
const opts = { a: 1 }; type K = keyof typeof opts
Будує рядковий тип з інших рядкових типів.
type Route = `/users/${string}`
З'єднує типи кортежів кінець у кінець.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Тип, чиє визначення посилається на себе.
type Json = string | number | Json[] | { [k: string]: Json }
Перевіряє значення щодо типу і зберігає його вужчий літеральний тип.
const c = { dark: "#000" } satisfies Record<string, string>
Зберігає літеральний тип викликача замість його розширення (TS 5.0).