DEV Community

Cover image for Transformações de Tipo em Tempo de Compilação no TypeScript
Levy Henrique Alves Nunes
Levy Henrique Alves Nunes

Posted on

Transformações de Tipo em Tempo de Compilação no TypeScript

Em programação de sistemas robustos e flexíveis, o entendimento e a manipulação adequados dos tipos são vitais. O TypeScript, como superconjunto tipado do JavaScript, permite operações de asserção de tipo, que orientam o compilador sobre como tratar determinadas variáveis. Vamos mergulhar mais profundamente na diferença entre casting e asserções de tipo e explorar os tipos de asserção personalizados.

Casting vs. Asserções de Tipo: Uma Distinção Fundamental

O que é Casting?

Em linguagens de programação tradicionais, "casting" refere-se ao processo de converter explicitamente um tipo de variável em outro. Esta conversão pode ser tanto em nível de compilação quanto em tempo de execução, e geralmente tem implicações diretas na representação subjacente da variável ou valor.

Asserções de Tipo em TypeScript

No contexto do TypeScript, não estamos alterando a representação subjacente do valor. Em vez disso, estamos simplesmente informando ao compilador para tratar a variável como se ela fosse de um tipo diferente. Essa operação é chamada de "asserção de tipo".

let valor: any = "Uma string qualquer";

let minhaString = valor as string; // asserção de tipo
Enter fullscreen mode Exit fullscreen mode

A asserção acima não muda o valor de valor. Em vez disso, indica ao compilador que o desenvolvedor está confiante de que valor é uma string e que o código subsequente deve tratá-lo como tal.

Tipos de Asserção Personalizados: Indo Além dos Tipos Básicos

Há momentos em que as asserções básicas não são suficientes. Suponha que você não apenas queira assegurar que uma variável é uma string, mas que ela obedece a um formato específico, como um endereço de e-mail.

Introduzindo Marcas de Tipo

Uma marca de tipo é uma maneira de criar um tipo distinto, mesmo que esse tipo seja estruturalmente idêntico a outro.

type Email = string & { __emailValidated: unique symbol };
Enter fullscreen mode Exit fullscreen mode

Aqui, Email é efetivamente uma string, mas não é apenas qualquer string. É uma string que foi "marcada" como um e-mail validado.

Validação e Asserção

Podemos combinar essa marca de tipo com uma função de asserção para criar um sistema robusto de validação:

function validateAsEmail(input: string): asserts input is Email {
    if (!/\S+@\S+\.\S+/.test(input)) {
        throw new Error("Invalid email format.");
    }
    (input as any).__emailValidated = Symbol("emailValidated");
}
Enter fullscreen mode Exit fullscreen mode

Dentro do contexto de uma aplicação, essa função pode ser usada para assegurar que qualquer string passada para ela, se passar pela validação, pode ser tratada com confiança como um e-mail validado no restante do código.

Conclusão

Ao trabalhar com TypeScript, a capacidade de informar ao compilador sobre as características e garantias de nossos tipos é um recurso valioso. Com asserções de tipo e a habilidade de definir e usar marcas de tipo, ganhamos uma ferramenta adicional para construir sistemas que são ao mesmo tempo flexíveis e seguros. Esta interseção entre o entendimento profundo do domínio do problema e as capacidades do sistema de tipos nos permite criar software mais robusto e confiável.

Top comments (0)