Transformações de Tipo em Tempo de Compilação no TypeScript
Levy Henrique Alves Nunes
Posted on August 25, 2023
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
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 };
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");
}
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.
Posted on August 25, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.