Os padrões de generics a que recorre, agrupados por função: declarar um parâmetro de tipo, restringi-lo, dar-lhe omissão, ramificar com um condicional, capturar com infer e mapear sobre uma forma. Cada linha emparelha o padrão com um exemplo de uma linha.
Um genérico é um parâmetro de tipo: um marcador para um tipo que o chamador escolhe, para que uma função ou tipo sirva muitas formas sem perder precisão. Leia <T> como para algum tipo T. O poder vem de restringir T, ramificar sobre ele e mapear sobre ele. Os padrões abaixo são o vocabulário de trabalho.
Tabela de referência · 28 entradas
Padrões de Generics em TypeScriptExplained
28 of 28 rows
Declarar
Um parâmetro de tipo que o chamador escolhe.
function first<T>(xs: T[]): T
Vários parâmetros de tipo independentes.
function pair<T, U>(a: T, b: U): [T, U]
Um segundo parâmetro ligado às chaves do primeiro.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Uma classe com um parâmetro de tipo nos seus campos e métodos.
class Box<T> { value: T }
Uma forma de objeto com um parâmetro de tipo.
interface Result<T> { data: T }
Um parâmetro de tipo numa arrow function; a vírgula final impede que ficheiros .tsx o leiam como JSX.
const first = <T,>(xs: T[]): T => xs[0]
Restringir
Exige que T seja atribuível a Type.
function len<T extends { length: number }>(x: T)
Restringe T a uma chave de outro tipo.
type Keys<O> = keyof O
Restringe T a uma classe construtível.
function make<C extends new () => C>(c: C): C
Exige que T satisfaça várias restrições ao mesmo tempo.
function log<T extends Error & { code: number }>(e: T)
Restringe a qualquer coisa; mantém o parâmetro genérico sem o estreitar.
type Wrap<T> = T extends unknown ? { v: T } : never
Omissão e infer
Dá a T um valor por omissão quando o chamador o omite.
function parse<T = string>(): T
Captura um tipo dentro de um condicional.
type El<T> = T extends Array<infer I> ? I : never
Desembrulha uma Promise aninhada no seu tipo interno.
type Data = Awaited<Promise<User>>
Captura uma peça de um tipo template literal.
type Path<S> = S extends `/api/${infer R}` ? R : never
Verifica a união inteira de uma vez; um T nu infere um membro de cada vez.
type El<T> = [T] extends [Array<infer I>] ? I : never
Condicional e mapeado
Escolhe um tipo conforme T é ou não atribuível a U.
type IsStr<T> = T extends string ? true : false
Constrói um novo tipo de objeto transformando cada chave de T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Um objeto cujas chaves são K e os valores são V.
type Scores = Record<string, number>
Genéricos incorporados derivados dos padrões acima.
type Preview = Pick<User, "id" | "name">
Um T simples antes de extends corre uma vez por membro da união e une os resultados.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Adiciona ou remove modificadores em chaves mapeadas.
type Req<T> = { [K in keyof T]-?: T[K] }
As chaves de um valor em runtime, como tipo.
const opts = { a: 1 }; type K = keyof typeof opts
Constrói um tipo de cadeia a partir de outros tipos de cadeia.
type Route = `/users/${string}`
Une tipos tuple de ponta a ponta.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Um tipo cuja definição se refere a si próprio.
type Json = string | number | Json[] | { [k: string]: Json }
Verifica um valor contra um tipo e mantém o seu tipo literal mais estreito.
const c = { dark: "#000" } satisfies Record<string, string>
Mantém o tipo literal do chamador em vez de o alargar (TS 5.0).