O que é e para que serve o TypeScript를 추론하지 않습니까?

TypeScript를 사용하려면 키워드를 사용하십시오infer. Ela não é muito comum no dia-a-dia, mas a maioria das bibliotecas mais avançadas em algum momento vai utilizar oinfer para algum tipo de operação.

Para entendermos completamente o infer , precisamos ter uma noção de como o TypeScript faz a asserção de tipos, e também a hierarquia desses tipos. Eu não vou entrar em detalhes sobre essas informações aqui agora, mas você pode achar vários conteúdos sobre isso na própria documentação do TS.

O infer é uma 키워드 que 보완 o que chamamos de conditional typing, ou tipos condicionais, que é quanto temos uma inferencia de tipos, seguida de uma condição, por exemplo:

type NonNullable<T> = T extends null | undefined ? never : T


No exemplo anterior, estamos pegando um tipo e verificando se ele é uma extensão ou de null ou de undefined , ou seja, tipos que não resolvem para true , e ai estamos fazendo uma type condition para dizer: "Se o tipo for um desses você retorna never , caso contrário retorna o próprio tipo".

O infer permite irmos um pouco mais além do que estamos acostumados nesses modelos. A ideia é que podemos definir uma variável dentro da nossa inferência de tipo que pode ser usada ou retornada, é como se pudéssemos fazer um const tipo = <inferencia> .

예를 들어, vamos olhar o utilitário nativo do TS chamado ReturnType , que pega uma função passada como paraâmetro e retorna qual é o tipo do seu retorno:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any


O que está acontecendo aqui é uma inferência condicional, já que o infer não pode ser utilizado fora de condicionais. Primeiro verificamos se o tipo passado estende uma assinatura de função, se sim, vamos jogar o retorno dessa função para uma variável que chamamos de R , e ai retorná-la.

Outro exemplo, é extrair o retorno de uma promise, como eu comentei aqui , se formos pensar em como podemos fazer esse tipo, primeiro temos que verificar se o tipo passado é uma extensão do tipo Promise<T> , e depois inferir T para retornálo, caso contrário, retornamos never :

type Unpromise<P> = P extends Promise<infer T> ? T : never


Outros casos de uso



Podemos usar o infer em uma série de casos, os mais comuns são:
  • Obter o primeiro paraâmetro de uma função:

  • type FirstArgument<T> = T extends (first: infer F, ...args: any[]) => any ? F : never
    


  • Obter o tipo de um 배열

  • type ArrayType<T> = T extends (infer A)[] ? A : T
    


  • Recursivamente obter o tipo de uma função até achar seu tipo final

  • type ExtractType<T> = T extends Promise<infer R>
      ? R
      : T extends (...args: any[]) => any
            ? ExtractType<ReturnType<T>>
            : T
    

    좋은 웹페이지 즐겨찾기