Literal Types

Literal Types

O Typescript possui um recurso bastante interessante que nos permite colocar valores como tipos de dados.

E Isso não só ajuda a restringir o seu uso, pois a partir de agora não ficamos presos aos tipos, como também aos próprios valores.

Esse recurso é chamado de Literal Types e durante a sua jornada como desenvolvedor, você verá que este recurso é bastante utilizado com o Union Types.

Vamos nessa? 🙂

O que são Literal Types?

No Typescript, um Tipo Literal (tradução para Literal Types), refere-se a um recursos que permite especificar um tipo exato que uma variável poderá armazenar.

Isso significa dizer que, em vez de você declarar um tipo genérico, como uma string, number, boolean e etc, você pode definir exatamente quais valores que serão aceitos dentro de uma variável ou parâmetro.

Atualmente existem 3 tipos principais de Literal Types que podemos usar.

String Literal Types

Como o próprio nome já nos diz, é um tipo customizado na qual você especifica um valor do tipo string que uma variável pode conter, observe o exemplo abaixo:

let statusMode: 'success' | 'error';

statusMode = 'success';//Válido
statusMode = 'error';//Válido
statusMode = 'pending';//Inválido, pois 'pending' não esta na lista permitida

No código acima, nós criamos uma variável chamada statusMode, que inicialmente é do tipo string, mas que só pode armazenar dois tipos diferentes de strings que são: success e error.

A partir do momento em que o desenvolvedor tentar atribuir uma outra string diferente, como é o caso do 'pending', o Typescript não deixa, pois aquela string em especifico não esta na lista permitida.

É como se criassemos uma condicional na qual verificasse se o valor atribuído é success ou error, onde tudo o que for diferente disso, retorna um erro.

Para adicionar mais elementos a sua lista, basta seguir a lógica anterior por meio de uma barra em pé (|), observe:

let statusMode: 'success' | 'error' | 'pending' | 'waiting';

statusMode = 'success';//Válido
statusMode = 'error';//Válido
statusMode = 'pending';//Válido
statusMode = 'waiting';//Válido
statusMode = 'micilini';//Inválido, pois não esta na lista

Number Literal Types

Assim como as strings literais, a diferença é que aqui trabalhamos com valores númericos:

let statusCode: 200 | 404 | 500;

statusCode = 200; // válido
statusCode = 404; // válido
statusCode = 403; // inválido, pois 403 não está na lista permitida

Note que quando tentamos atribuir o número 403 à variável statusCode, o Typescript nos retorna um erro de compilação.

Boolean Literal Types

Assim como as strings e números literais, temos também o tipo booleano, observe:

let isLoading: true;

isLoading = true; // válido
isLoading = false; // inválido, pois só é permitido o valor true

let change: false;

change = true;//Inválido, pois só é permitido o valor false
change = false;//Válido

let all: true | false;

all = true;//Válido
all = false;//Válido

No exemplo acima, começamos declarando uma variável chamada isLoading que só aceita valores do tipo true.

Em seguida declaramos uma variável chamada change que só aceita valores do tipo false.

E por fim uma variável chamada all que aceita ambos os valores.

Literal Type com funções

Um outro exemplo muito interessante que eu gostaria de trazer aqui, é uma função que trabalha com Literal Types, e que recebe diversas direções:

function qualDirecao(direcao: "esquerda" | "direita" | "centro"){
 console.log('Vamos seguir pela ' + direcao);
}

qualDirecao("esquerda");//Válido
qualDirecao("cima");//Inválido, pois "cima" não esta na lista

Note que quando tentamos atribuir a string "cima", o Typescript gera um erro de compilação.

Arquivos da lição

Os arquivos desta lição podem ser encontrados no repositório do GitHub por meio deste link.

Conclusão

Nesta lição você aprendeu um pouco mais sobre os tipos literais, e como você pode usá-los dentro da sua aplicação.

Até a próxima lição 😌