Um momento
Aula 22
Cursos / Aprenda TypeScript - Tutorial Básico Vindo do JavaScript
Como Declarar uma Interface para Definir o Tipo de um Argumento de Função

Summary

Resumo da Aula sobre Interfaces em TypeScript

Introdução

Na aula de hoje, aprendemos a criar interfaces para descrever tipos de funções no TypeScript. Já conhecemos interfaces para definir propriedades de objetos e hoje vamos aplicar esse conceito a funções, especificando seus parâmetros de entrada e saída.

Funções Anônimas e Tipos

  • Ao utilizar funções anônimas como argumentos (callbacks) em outras funções, podemos aplicar tipos a essas funções através de interfaces.
  • O TypeScript irá notificar se houver alguma incompatibilidade com o tipo definido na interface.

Exemplo Prático

  1. Definição da Função:

    • Criamos uma variável computar que armazena uma função com 2 parâmetros: ABC (número) e mensagem (string). A função retorna um valor booleano (true ou false).
    const computar = (ABC: number, mensagem: string): boolean => {
        // Implementação...
        return true;
    };
    
  2. Uso da Função:

    • Uma outra função chamada fazerAlgumaCoisa recebe como argumento uma função do tipo computar, que será chamada dentro dela com valores apropriados.
  3. Definindo a Interface:

    • Criamos uma interface chamada FuncaoComputar para definir a assinatura da função computar.
    • A interface especifica os tipos dos parâmetros e do retorno.
    interface FuncaoComputar {
        (ABC: number, mensagem: string): boolean;
    }
    
  4. Aplicando Tipo à Função:

    • A variável da função computar pode ser atribuída explicitamente ao tipo FuncaoComputar, evitando a necessidade de definir tipos para cada parâmetro novamente.
    • O TypeScript deduzirá automaticamente os tipos dos parâmetros e do retorno da função.

Restrições e Erros

  • Se um parâmetro for removido ou mudado, TypeScript gerará um erro indicando que os tipos não são compatíveis, pois os tipos definidos na interface devem ser respeitados.
  • O nome dos parâmetros na função pode ser qualquer um, desde que os tipos sejam os mesmos definidos na interface.

Conclusão

  • A definição de interfaces para funções é uma prática recomendada em TypeScript para garantir a segurança dos tipos.
  • Embora possamos omitir a definição dos tipos de parâmetros, é aconselhável fazer isso explicitamente no início para melhor compreensão.

Até a próxima aula!

Video Transcript

Lá pessoal, na esta aula vamos aprender sobre como criar um interface para descrever um tipo de função. Como a gente já viu anteriormente, podemos criar interfaces para poder definir propriedades de um objeto. Também podemos definir um interface para descrever a entrada e saída de uma função. Por exemplo, normalmente quando a gente usa funções anônimas, como a gente passa como argumento para outras funções, callbacks, nós podemos atribuir um tipo, essa função baseada na interface e assim o TypeScript, vai reclamar se você programar de uma maneira que não obedece essa interface. Vamos supor que eu estou no Playground, tem uma variável chamado computar que eu vou usar para armazenar uma função anônima. Essa função está definindo aqui, vamos focar nas linhas 3 e 6, do lado esquerdo aqui. Então, temos aqui computar igual a entrada da função, 2 parâmetros, ABC e mensagem. O corpo da função faz alguma coisa, eu vou ter esses 3 pontos para dizer que vai ter alguma coisa que a gente vai focar só no conceito, e não no conteúdo, o que a função vai fazer e no final retorna o valor booleano true. Então, como a gente está fazendo TypeScript, vamos praticar aqui e adicionar os tipos nessa declaração aqui. Então, vamos começar na função aqui. O primeiro argumento da função precisa de um tipo. Se você não pônei um argumento, ele vai ter um implícitamente tipo n. n não é muito bom, tn. Então, me cuidado, quando você tem n, a gente sempre quer evitar tn. Então, sempre vamos definir os tipos aqui. O tipo do primeiro parâmetro vai ser do tipo número, ABC vai ser o número, number, então 2 pontos number. Mensagem vai ser um string, então esse segundo parâmetro vai ser o tipo 2 pontos string. Então, essa assinatura na entrada. Agora, da saída aqui vai ser o booleano. Então, aqui, depois dos parâmetros, fecho parâmetros, 2 pontos, booleano. Vai dizer que essa função retorna um valor do tipo booleano. Isto é true ou false? Tá certo? Então, legal. Agora, vamos supor aqui mais adiante que tem alguma função chamada de fazer alguma coisa que leva como argumento. Esse parâmetro é chamado de função de computar, que na verdade vai ser a função que a gente vai chamar aqui. Nesse caso, vai ser essa função do computar. Na linha 19, vamos chamar o fazer alguma coisa, essa função com o parâmetro. O argumento será a função anônima computar, que será chamada aqui dentro da função fazer alguma coisa. E vai passar como argumento 2, 3, 4, 5, 6. E mensagem vai ser minha mensagem e vai retornar true como resultado aqui. E vai fazer alguma coisa que a gente vai omitir aqui. Agora, seria legal como fazer alguma coisa, temos que definir o tipo, né? Desse parâmetro chamado de função de computar. Mas qual é o tipo desse cara aqui? Bem, a gente aprendeu que a gente pode definir tipo number, tipo string, mas quando tem uma função, e aí o que acontece? Então, a gente pode definir a interface para descrever a assinatura da função computar. E vamos usar esse novo tipo, nova interface aqui, dos 2 pontos depois de função de computar. Vamos aqui em cima, lá em cima depois, na nova linha 1, eu vou dizer interface. A gente pode dizer qualquer nome para essa função, sei lá. Pode ser função de computar, como o nome da interface. Agora, para descrever, você descreve aqui a entrada e a saída da função. Abra os parâmetros, correta essa entrada. Pode ser o ABC aqui, do tipo number, vírgula, vai ser mensagem do tipo string, e depois 2 pontos. Qual é o valor de saída? Bullion. Termina aqui, tá? Com os 2 pontos vírgula. Então, descreve aqui essa interface função de computar, que tem uma assinatura de função aqui. Nós podemos usar esse tipo aqui, função de computar, aqui na linha 15. Agora, função de computar vai ser aqui tipo, não é number, não é string, então é do tipo função de computar. Dessa maneira, nós estamos dizendo type script, eita, checa isso e estiver chamando fazer alguma coisa com a função que não obedeça esse função de computar, então o negócio está errado. Te mostro aqui quando vai dar erro. Por exemplo, computar aqui, definição, linhas 7 a 10. Se eu remover o primeiro parâmetro e só definir o computar com um parâmetro, vamos ver o que dá aqui. Linha do bit3 já está dando erro. Está dizendo que o argumento de tipo função aqui com um parâmetro mensagem, retorno boleano, não pode ser atribuído ao parâmetro do tipo função de computar, por quê? Porque mensagens e ABC são incompatíveis, né? O tipo number não pode ser atribuído ao tipo string, por quê? Porque eu mudei a definição de computar e o primeiro aguenta a mensagem, mas a interface diz que primeiro tem que ser um ABC do tipo number. O que mais importa aqui, na verdade, é o tipo. O nome nem importa muito, que você pode até dizer o nome diferente aqui, que vai dar na mesma, porque o que importa é o tipo, o tipo que está errado. O tipo tem que ser number e eu tenho um string, então está errado. Então eu vou reverter aí, tá? É isso, criamos a interface para descrever a função e podemos, como a função é passada como argumento, a outra função. Quando a gente for descrever o tipo dessa função, argumento aqui de função, vai ser função computar. Como eu já tinha disse, agora pouco, o nome aqui não importa muito como você definir a função para passar aqui. O que porta para a interface, para o BDC interface, é os tipos de cada parâmetro que tem que ser o mesmo. Por exemplo, eu sei que eu defini ABC e mensagens como os parâmetros, o nome dos parâmetros na linha 2, mas nem precisa ser o mesmo, pode ser DEF e MSG. Aí dá a mesma coisa e não vai reclamar. Por quê? Porque os tipos são os mesmos, então TypeScript não se importa se você tem um nome diferente. Agora o tipo tem que ser o mesmo. Tá bom? Agora, só para terminar aqui, só mais umas coisas para a gente falar de um... Para encurter as suas definições, nós aprendemos aqui que podemos atribuir aqui os tipos de cada parâmetro nessa função. Agora, se você pegar o computar aqui na linha 5 e você definir o computar como tipo de função de computar explicitamente, nem precisa até digitar os tipos do DEF aqui, nem do MSG. Nem precisa até digitar o tipo de retorno aqui, porque o TypeScript vai... Ele vai saber, ele vai deduzir que você está referindo o DEF ao tipo NUM, NUM, e o MSG ao tipo STRING, é uma função que retorna o Boolean. Por quê? Primeiro você definiu uma variável com a interface função de computar. Com esse TypeScript vai saber, ah, tá certo, essa função aqui anônima tem que obedecer essa interface que funciona o computar. Então, por isso, o DEF deve ser um NUM, o MSG vai deduzir que vai ser um STRING. Ah, então você pode aumentar aqui. Então, eu vou cuidar com você fazer isso, porque se você fizer isso sem entender que realmente a gente tem isso, e porque a gente fez a linha 5 aqui, definiu a variável do tipo função de computar, dessa maneira aqui. Então, eu recomendo você não fazer isso no começo, fazer tudo digitado explicitamente, e depois, se você se acostuma com isso, você pode tirar e omitir as coisas e deixar o TypeScript desazir. Vai virar normalmente o JavaScript normal, mas depende de você. Tá bom? É por essa aula é só, e até a próxima. Tchau!
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: