Tipos de dados
Tipos de dados básicos
Number (número)
Representa números inteiros, decimais, hexadecimais binários e octais:
let idade: number = 30;
let preco: number = 19.99;
let hex: number = 0xf00d;
let binario: number = 0b1010;
String (texto)
Sequências de caracteres, podendo ser declaradas com aspas simples, duplas ou crase:
let nome: string = 'Gil';
let saudacao: string = "Olá, mundo!";
let template: string = `Meu nome é ${nome}`;
Boolean (booleano)
Valores lógicos: true ou false.
let ativo: boolean = true;
let inativo: boolean = false;
Array (vetor)
Coleção de elementos de mesmo tipo, declarada como tipo[] ou Array<tipo>:
let numeros: number[] = [1, 2, 3, 4];
let cores: string[] = ['vermelho', 'azul'];
Tuple (tupla)
Array de tamanho fixo em que o tipo de cada elemento pode ser diferente:
let pessoa: [string, number] = ['João', 25];
Enum (enumerado)
Define um conjunto de valores nomeados:
enum DiaSemana { Domingo, Segunda, Terça };
let hoje: DiaSemana = DiaSemana.Segunda;
Any (qualquer tipo)
Aceita qualquer valor, útil para migração de JavaScript:
let qualquerCoisa: any = 42;
qualquerCoisa = 'Olá';
qualquerCoisa = true;
Void
Usado em funções que não retornam valor:
function saudacao(): void {
console.log('Olá, mundo!');
}
Null e Undefined
Representam ausência de valor e valor não definido:
let valorNulo: null = null;
let valorIndefinido: undefined = undefined;
Never
Usado para funções que nunca retornam (ex: lançam exceção):
function lancaErro(mensagem: string): never {
throw new Error(mensagem);
}
Union (união)
Permite que uma variável tenha mais de um tipo:
let numeroOuTexto: number | string = 10;
numeroOuTexto = "dez";
Tipos de dados avançados
Genéricos (Generics)
Permitem criar funções, classes e interfaces reutilizáveis, que aceitam diferentes tipos como parâmetros.
function identidade<T>(valor: T): T {
return valor;
}
let resultadoNum = identidade<number>(10);
let resultadoStr = identidade<string>("teste");
União e Interseção (Union & Intersection Types)
- União: Aceita múltiplos tipos.
- Interseção: Combina tipos diferentes em um só.
// União
let valor: string | number;
valor = "texto";
valor = 42;
// Interseção
type A = { nome: string };
type B = { idade: number };
type C = A & B; // { nome: string; idade: number }
const pessoa: C = { nome: "Anna", idade: 30 };
Tipos Literal e Template Literal Types
Permitem definir valores restritos e criar tipos dinâmicos baseados em combinações de strings.
type Dia = "segunda" | "terca" | "quarta";
type Saudacao = `Olá, ${Dia}!`;
const msg: Saudacao = "Olá, segunda!";
Tipos Discriminados (Discriminated Unions)
Modelam estados complexos, usados em respostas de APIs e máquinas de estados.
type Sucesso = { status: "ok"; dados: object };
type Falha = { status: "erro"; erro: string };
type Estado = Sucesso | Falha;
function tratar(estado: Estado) {
if (estado.status === "ok") {
console.log("Sucesso!");
} else {
console.log("Erro:", estado.erro);
}
}
Tipos Mapeados (Mapped Types)
Criam novos tipos baseados em outros, modificando propriedades automaticamente.
type User = { id: number; nome: string };
// Todas as propriedades readonly
type ReadonlyUser = { readonly [K in keyof User]: User[K] };
// Todas as propriedades opcionais
type PartialUser = { [K in keyof User]?: User[K] };
Tipos Utilitários (Utility Types)
TypeScript oferece tipos auxiliares para manipular objetos e propriedades:
Partial<T>: Todas as propriedades opcionais.Readonly<T>: Todas as propriedades somente leitura.Record<K,T>: Mapeia um conjunto de chaves a valores.Pick<T,K>: Seleciona propriedades específicas.Omit<T,K>: Exclui propriedades específicas.
interface Produto { id: number; nome: string; preco: number; }
type ProdutoOpcional = Partial<Produto>;
type ProdutoSomenteLeitura = Readonly<Produto>;
type ProdutoSelecao = Pick<Produto, "id" | "nome">;
type ProdutoSemPreco = Omit<Produto, "preco">;
Assertion e Type Guards
Permitem a validação ou conversão segura entre tipos.
let valor: any = "123";
let tamanho: number = (valor as string).length;
function isString(valor: unknown): valor is string {
return typeof valor === "string";
}
Os tipos avançados tornam o TypeScript flexível e seguro para aplicações complexas, promovendo reutilização e robustez em projetos modernos.
