TypeScript, um superconjunto de JavaScript digitado estaticamente, ganhou enorme popularidade na comunidade de tecnologia devido à sua capacidade de detectar erros antecipadamente e melhorar a legibilidade do código. Um dos recursos poderosos do TypeScript é a palavra-chave infer, que permite aos desenvolvedores escrever tipos mais expressivos e dinâmicos.
Introduzida no TypeScript 2.8, a palavra-chave infer é usada em tipos condicionais para criar variáveis de tipo temporárias. Essas variáveis de tipo podem então ser usadas para inferir tipos dentro de uma ramificação verdadeira ou falsa de um tipo condicional. A palavra-chave infer permite que os desenvolvedores escrevam tipos mais dinâmicos e expressivos, pois permite que o TypeScript determine um tipo específico com base no contexto em que é usado.
Para entender melhor como inferir funciona, vamos dar uma olhada na sintaxe básica de um tipo condicional:
type MyConditionalType= T extends SomeType ? TrueType : FalseType;
Neste exemplo, T é um parâmetro de tipo genérico e SomeType representa um tipo ao qual T está sendo comparado. Se T estender SomeType, o tipo de MyConditionalType
Agora, vamos introduzir a palavra-chave infer na mistura:
type MyInferredType= T extends SomeType ? U : FalseType;
Aqui, usamos a palavra-chave infer para criar uma variável de tipo temporária U dentro do ramo verdadeiro do tipo condicional. Se T estender SomeType, o TypeScript tentará inferir o tipo de U com base no tipo de T.
ReturnType é um tipo de utilitário que extrai o tipo de retorno de uma função. É um exemplo perfeito de como a palavra-chave infer pode ser usada para criar tipos dinâmicos. Aqui está a definição de ReturnType:
type ReturnTypeany> = T extends (...args: any[]) => infer R ? R : any;
Nesta definição, T é um tipo de função que recebe qualquer número de argumentos e retorna qualquer tipo. Usando a palavra-chave infer, criamos uma variável de tipo temporária R para representar o tipo de retorno da função. Se T for uma função, o TypeScript infere o tipo de retorno e o atribui a R.
Vamos ver o ReturnType em ação:
function greet(name: string): string { return `Hello, ${name}!`; } type GreetReturnType = ReturnType; // GreetReturnType is inferred as 'string'
Aqui, ReturnType é usado para inferir o tipo de retorno da função greet, que é string.
Outro tipo de utilitário útil que aproveita a palavra-chave infer é Parâmetros. Este tipo extrai os tipos de parâmetros de uma função como uma tupla. A definição de Parâmetros é a seguinte:
type Parametersany> = T extends (...args: infer P) => any ? P : never;
Neste exemplo, criamos uma variável de tipo temporária P para representar os tipos de parâmetros da função. Se T for uma função, o TypeScript infere os tipos de parâmetros e os atribui a P como uma tupla.
Vejamos um exemplo usando parâmetros:
function add(a: number, b: number): number { return a b; } type AddParameters = Parameters; // AddParameters is inferred as [number, number]
Aqui, Parâmetros é usado para inferir os tipos de parâmetros da função add, que é uma tupla [número, número].
O tipo de utilitário PromiseType pode ser usado para extrair o tipo para o qual uma Promise resolve. Isto é particularmente útil ao lidar com funções assíncronas. Aqui está a definição de PromiseType:
type PromiseType> = T extends Promise ? U : never;
Neste exemplo, criamos uma variável de tipo temporária U para representar o tipo para o qual a Promise resolve. Se T for uma promessa, o TypeScript infere o tipo resolvido e o atribui a U. Aqui está um exemplo:
async function fetchData(): Promise{ return "Fetched data"; } type FetchedDataType = PromiseType >; // FetchedDataType is inferred as 'string'
Nesse caso, PromiseType é usado para inferir o tipo para o qual a promessa da função fetchData resolve, que é string.
O tipo de utilitário UnboxArray pode ser usado para extrair o tipo dos elementos dentro de um array. Aqui está a definição de UnboxArray:
type UnboxArray> = T extends Array ? U : never;
Neste exemplo, criamos uma variável de tipo temporária U para representar o tipo dos elementos dentro do array. Se T for um array, o TypeScript infere o tipo de elemento e o atribui a U. Por exemplo:
type MyArray = number[]; type ElementType = UnboxArray; // ElementType is inferred as 'number'
Aqui, UnboxArray é usado para inferir o tipo de elementos dentro do tipo MyArray, que é número.
Embora a palavra-chave inferir seja incrivelmente poderosa, ela tem algumas limitações:
Só pode ser usado em tipos condicionais.
Nem sempre é possível para o TypeScript inferir o tipo correto, especialmente ao lidar com tipos complexos ou recursivos. Nesses casos, os desenvolvedores podem precisar fornecer anotações de tipo adicionais ou refatorar seus tipos para ajudar o TypeScript a inferir o tipo correto.
Ao compreender e aproveitar o poder da inferência, você pode criar projetos TypeScript mais flexíveis. Comece a considerar incorporar a palavra-chave infer em seu kit de ferramentas hoje mesmo.
Se você achou isso útil, considere assinar meu boletim informativo para artigos e ferramentas mais úteis sobre desenvolvimento web. Obrigado por ler!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3