TypeScript: Tipos básicos do TypeScript
Última atualização: 2026-08-26
O sistema de tipos do TypeScript começa com sete tipos básicos — domine-os e você terá dominado o “alfabeto” das anotações de tipos.
1. Sete tipos básicos
O TypeScript herda os sete tipos básicos do JavaScript e oferece uma sintaxe de anotação de tipos para cada um deles:
| Tipo | Descrição | Exemplo de valor |
|---|---|---|
string |
string | "hello", 'world', `template` |
number |
Números (inteiros e decimais) | 42, 3.14, 0xFF |
boolean |
Valor booleano | true, false |
null |
valor vazio | null |
undefined |
Indefinido | undefined |
symbol |
Identificador exclusivo | Symbol("id") |
bigint |
inteiro grande | 100n, BigInt(9007199254740991) |
(1) string
As cadeias de caracteres podem ser representadas usando aspas simples, aspas duplas ou crases (cadeias de caracteres de modelo):
let firstName: string = "Charlie";
let lastName: string = 'Wang';
let greeting: string = `Hello, ${firstName} ${lastName}`;
As strings de modelo (crase) suportam variáveis e expressões incorporadas; essa sintaxe foi introduzida no ES6 e é totalmente compatível com o TypeScript.
(2) número
Assim como o JavaScript, o TypeScript não faz distinção entre números inteiros e números de ponto flutuante — ambos são do tipo number:
let age: number = 25; // Integer
let price: number = 9.99; // Decimals
let hex: number = 0xFF; // Hexadecimal
let binary: number = 0b1010; // Binary
let octal: number = 0o744; // Octal
Number.MAX_SAFE_INTEGER (2^53 - 1), você deve usar bigint em vez de number; caso contrário, perderá precisão.
(3) booleano
Existem apenas dois valores: true e false. Eles são comumente usados para verificações condicionais e como sinalizadores de alternância:
let isActive: boolean = true;
let hasPermission: boolean = false;
▶ Exemplo: Anotações de tipos primitivos
// Defining Different Types of Variables
let title: string = "TypeScript Getting Started";
let version: number = 5.3;
let isPublished: boolean = true;
console.log("Courses:" + title);
console.log("Version:" + version);
console.log("Published:" + isPublished);
Saída:
Courses:TypeScript Getting Started
Version:5.3
Published:true
2. nulo e indefinido
No TypeScript, null e undefined são tanto valores quanto tipos. A diferença entre eles pode parecer sutil, mas é importante no sistema de tipos.
(1) Diferenças de significado
| Tipo | Significado | Quando aparece |
|---|---|---|
undefined |
“Ainda não atribuído” | Variável declarada, mas não inicializada; a função não possui valor de retorno |
null |
“Deixado em branco intencionalmente” | Definido pelo desenvolvedor para indicar “não há valor aqui” |
(2) Anotações de tipo
let notAssigned: undefined = undefined;
let emptyValue: null = null;
null e undefined podem ser atribuídos a variáveis de qualquer tipo (por exemplo, let name: string = null é válido). No entanto, uma vez que strictNullChecks seja habilitado, eles só poderão ser atribuídos a tipos do tipo null/undefined ou a tipos de união. É altamente recomendável que você habilite a verificação rigorosa de nulos.
(3) O impacto de strictNullChecks
// strictNullChecks: false(Default Relaxed Mode)
let name: string = null; // ✅ No errors,But at runtime name.toUpperCase() It will crash
// strictNullChecks: true(Strict Mode,Recommendations)
let name2: string = null; // ❌ Error:You cannot null Assign to string
let name3: string | null = null; // ✅ Correct:An explicit declaration might be null
strict: true inclui strictNullChecks: true. No modo estrito, qualquer valor que possa ser null ou undefined deve ser explicitamente declarado; isso evita 90% dos erros de tempo de execução do tipo “indefinido is not a função”.
3. O tipo symbol
symbol é um tipo primitivo introduzido no ES6, utilizado para criar identificadores globalmente únicos. Cada chamada ao Symbol() gera um valor único:
let id1: symbol = Symbol("id");
let id2: symbol = Symbol("id");
console.log(id1 === id2); // false —— Even if the descriptions are the same,Each symbol They are all unique.
▶ Exemplo: Como usar um símbolo como chave única para um objeto
let uniqueKey: symbol = Symbol("secret");
let user = {
name: "Diana",
age: 20
};
// Use symbol as a property key,Does not conflict with other attributes
user[uniqueKey] = "Hide Data";
console.log(user.name); // Normal Access
console.log(user[uniqueKey]); // Visit symbol Key value
Saída:
Diana
Hide Data
Symbol.iterator e implementações internas de frameworks). Para iniciantes, basta entender que “Symbol() gera um valor único cada vez que é chamado”.
4. O tipo bigint
bigint é um tipo introduzido no ES2020 que representa grandes números inteiros além do intervalo seguro de number. Um número seguido por n é um bigint:
let big1: bigint = 100n; // Literal Notation
let big2: bigint = BigInt(9007199254740991); // Function Syntax
// number Upper Limit for Secure Integers
let maxSafe: number = Number.MAX_SAFE_INTEGER; // 9007199254740991
let overflow: number = 9007199254740992; // Outside the safety range,Loss of Accuracy!
// bigint No loss of precision
let safe: bigint = 9007199254740992n; // Precise representation
bigint e number não podem ser usados juntos em cálculos — 100n + 50 resultará em um erro. É preciso primeiro padronizar o tipo para Number(100n) + 50 ou 100n + BigInt(50).
▶ Exemplo: Comparando a precisão do tipo bigint
// number Accuracy is lost when the safe range is exceeded
let a: number = 9007199254740992;
let b: number = 9007199254740993;
console.log(a === b); // true!Two different numbers are actually equal
// bigint Precise representation
let c: bigint = 9007199254740992n;
let d: bigint = 9007199254740993n;
console.log(c === d); // false —— Distinguish Correctly
Saída:
true
false
5. Omissão de anotações de tipo e melhores práticas
(1) Quando é necessário incluir uma anotação de tipo?
| Cenário | É obrigatório? | Motivo |
|---|---|---|
| Variáveis sem valores iniciais | ✅ Obrigatório | Caso contrário, o TypeScript não consegue inferir o tipo |
| Parâmetro da função | ✅ Obrigatório | O parâmetro não possui valor inicial para a inferência |
| Valor de retorno da função | ⚠️ Recomendado | O TypeScript pode inferir isso, mas uma anotação explícita proporciona maior clareza |
| A variável tem um valor inicial | ❌ Opcional | O TypeScript infere com base no valor inicial |
(2) Melhores práticas
// ✅ Recommendations:Omit the type annotation when a variable has an initial value(Type inference is sufficient)
let name = "Charlie";
let age = 20;
// ✅ Recommendations:Explicitly Labeling Function Parameters and Return Values
function greet(name: string): string {
return "Hello, " + name;
}
// ✅ Recommendations:Explicitly label when there is no initial value
let userId: number;
let isActive: boolean;
// ❌ Not recommended:Why include annotations when there are initial values?(Redundancy)
let name2: string = "Charlie"; // Superfluous——TypeScript It has already been deduced.
❓ Perguntas Frequentes
P: O TypeScript possui tipos float ou double? R: Não. Assim como o JavaScript, o TypeScript possui apenas um tipo numérico, que abrange tanto números inteiros quanto números de ponto flutuante. Todos os números no JavaScript são números de ponto flutuante de precisão dupla de 64 bits (IEEE 754); portanto, 1 e 1,0 são exatamente iguais em termos de tipo.
P: Qual é a diferença prática entre
nulleundefined? Quando cada um deve ser usado? R:undefinedindica “ainda não atribuído” (um estado gerado automaticamente pelo sistema), enquantonullindica “intencionalmente vazio” (um valor definido explicitamente pelo desenvolvedor). No desenvolvimento prático, recomenda-se usarnullpara indicar “sem valor” — poisundefinedpode resultar do esquecimento de atribuir um valor, enquantonullrepresenta uma escolha deliberada.
P: O tipo
biginté comumente usado? R: Na verdade, não. Na grande maioria dos casos, o tiponumberé suficiente (com um intervalo seguro de inteiros de até 2^53-1 ≈ 900 trilhões). Obiginté usado principalmente em cenários como algoritmos criptográficos, cálculos com números grandes e camposbigintem bancos de dados. Iniciantes precisam apenas saber que ele existe; eles poderão se aprofundar no assunto quando realmente precisarem usá-lo.
P: O uso excessivo de anotações de tipo afeta o desempenho? R: De forma alguma. As anotações de tipo existem apenas na fase de compilação; todas as informações de tipo são removidas do código JavaScript compilado, portanto, não há nenhuma sobrecarga em tempo de execução. Da mesma forma que os comentários não tornam um programa mais lento.
📖 Resumo
- O TypeScript possui sete tipos básicos: string, number, booleano, nulo, indefinido, symbol e bigint
- O tipo
numbernão faz distinção entre números inteiros e decimais; obiginté usado para números inteiros muito grandes e não pode ser utilizado em operações mistas com onumber. - No modo estrito,
nullouundefinednão podem ser atribuídos arbitrariamente a outros tipos; é necessário usar um tipo de união (string | null). - símbolo: Gera um identificador globalmente único, utilizado principalmente em cenários avançados
- As anotações de tipo podem ser omitidas quando as variáveis possuem valores iniciais (inferência de tipo); os parâmetros de função e as variáveis sem valores iniciais devem ser anotados.
📝 Exercícios
- Problema básico (Dificuldade ⭐): Declare cinco variáveis correspondentes a cinco tipos comuns (string, número, booleano, nulo, indefinido), atribua valores apropriados a elas e use
console.logpara exibi-las uma a uma. - Problema avançado (Dificuldade ⭐⭐): Escreva uma função
formatPrice(price: number, currency: string): stringque formate um preço numérico em uma string com o símbolo da moeda. Por exemplo,formatPrice(99.5, "¥")retorna"¥99.5". - Problema de desafio (Dificuldade ⭐⭐⭐): Verifique a precisão de
number— escreva um código para comparar se0.1 + 0.2e0.3são iguais e explique o resultado. Em seguida, usebigintpara calcular a soma de dois números inteiros grandes que excedamNumber.MAX_SAFE_INTEGERe verifique sebigintnão perde precisão.