Noções básicas do TypeScript
Este artigo explica as noções básicas do TypeScript.
YouTube Video
Executando "Hello World!"
Primeiro, executaremos o exemplo clássico "Hello World!" em TypeScript usando o Visual Studio Code.
npm install -g typescript
Instale o typescript
usando o comando npm
.
Crie um arquivo tsconfig.json
.
1{
2 "compilerOptions": {
3 "target": "ES6",
4 "module": "CommonJS",
5 "outDir": "out",
6 "sourceMap": true
7 }
8}
Crie um arquivo .vscode/launch.json
para habilitar a execução do arquivo main.ts
no Visual Studio Code.
1{
2 "version": "0.2.0",
3 "configurations": [
4 {
5 "type": "node",
6 "request": "launch",
7 "name": "Launch Program",
8 "skipFiles": [
9 "<node_internals>/**"
10 ],
11 "program": "${workspaceFolder}/main.ts",
12 "preLaunchTask": "tsc: build - tsconfig.json",
13 "outFiles": [
14 "${workspaceFolder}/out/main.js"
15 ]
16 }
17 ]
18}
Crie um arquivo main.ts
que exiba "Hello World!". Você pode executá-lo no Visual Studio Code pressionando a tecla F5
.
1console.log("Hello World!");
Ao configurar dessa forma, você pode executar arquivos TypeScript no VSCode.
Visão geral do TypeScript
TypeScript (TS) é um superconjunto do JavaScript desenvolvido pela Microsoft. TypeScript suporta tipagem estática, permitindo um código mais robusto e sustentável.
Tipagem Estática
- TypeScript adiciona tipos ao JavaScript e realiza a verificação de tipos em tempo de compilação. Isso permite evitar bugs relacionados a tipos com antecedência.
1let message: string = "Hello, TypeScript";
2console.log(message);
Compilação
- Como o TypeScript não pode ser executado diretamente em um navegador, ele precisa ser transpilado (compilado) para JavaScript. Use o
tsc
(TypeScript Compiler) para converter arquivos TS em arquivos JS.
Anotações de Tipos Opcionais
- TypeScript também realiza inferência de tipos, mas permite que você especificar explicitamente os tipos quando necessário. Isso melhora a legibilidade e a confiabilidade do código.
1function greet(name: string): string {
2 return `Hello, ${name}`;
3}
4console.log(greet('John'));
Interfaces
- O TypeScript fornece
interface
para definir a forma dos objetos. Isso permite uma gestão rigorosa da estrutura dos objetos.
1interface Person {
2 name: string;
3 age: number;
4}
5const user: Person = { name: "John", age: 30 };
6console.log(user.name);
Classes
- O TypeScript fornece extensões à sintaxe de classes do JavaScript e suporta herança, modificadores de acesso (
public
,private
,protected
) e classes abstratas.
1class Animal {
2 protected name: string;
3 constructor(name: string) {
4 this.name = name;
5 }
6 speak(): void {
7 console.log(`${this.name} makes a sound.`);
8 }
9}
10
11class Dog extends Animal {
12 speak(): void {
13 console.log(`${this.name} barks.`);
14 }
15}
16const animal = new Animal('Generic Animal');
17animal.speak();
18
19const dog = new Dog('Buddy');
20dog.speak();
Genéricos
- No TypeScript, você pode escrever código reutilizável e seguro em termos de tipos usando genéricos.
1function identity<T>(arg: T): T {
2 return arg;
3}
4console.log(identity<string>("Hello Generics"));
Ecossistema
- O TypeScript é totalmente compatível com o ecossistema JavaScript e pode usar o código JavaScript existente como está. Além disso, é integrado com bibliotecas populares como React e Node.js.
Ferramentas poderosas para desenvolvedores
- O TypeScript oferece recursos avançados, como autocompletar, suporte para refatoração e verificação de erros em editores como o VSCode.
O TypeScript é particularmente útil para aumentar a confiabilidade e melhorar a produtividade dos desenvolvedores em projetos grandes.
Variáveis no TypeScript
Isso explica os conceitos básicos e o uso de variáveis no TypeScript.
Declaração de Variáveis
No TypeScript, as variáveis são declaradas usando três palavras-chave: let
, const
e var
. Cada palavra-chave tem características diferentes.
Exemplo de let
:
let
tem escopo de bloco (válido apenas dentro de chaves {}
). Os valores podem ser reatribuídos posteriormente.
1let count: number = 10;
2console.log(count); // Outputs: 10
3
4count = 20;
5console.log(count); // Outputs: 20
Exemplo de const
:
const
não pode ser reatribuído, portanto, o valor atribuído uma vez não pode ser alterado. No entanto, o conteúdo de objetos e arrays pode ser modificado.
1const pi: number = 3.14;
2console.log(pi); // Outputs: 3.14
3
4// pi = 3.14159; // Error: Reassignment is not allowed
5
6const fruits: string[] = ["apple", "banana"];
7fruits.push("orange");
8console.log(fruits); // Outputs: ["apple", "banana", "orange"]
Exemplo de var
:
var
tem escopo de função e pode ser reatribuído. No entanto, ao ignorar o escopo de bloco, pode causar comportamentos inesperados em comparação com let
ou const
.
1var message: string = "Hello, world!";
2console.log(message); // Outputs: Hello, world!
3
4message = "Hello, TypeScript!";
5console.log(message); // Outputs: Hello, TypeScript!
6
7// (`var` ignores block scope)
8if (true) {
9 var localMessage = "Hello again!";
10}
11console.log(localMessage); // "Hello again!"
Anotações de Tipos
No TypeScript, você pode anotar explicitamente os tipos para variáveis. A inferência de tipos também é suportada, mas as anotações de tipo são úteis em cenários complexos.
1let isDone: boolean = false;
2console.log(isDone); // Outputs: false
3
4let userName: string = "Alice";
5console.log(userName); // Outputs: Alice
Variáveis Não Inicializadas
Se uma variável for declarada sem inicialização, undefined
será atribuído por padrão. Uma variável declarada com let
deve ser explicitamente atribuída como undefined
ou incluir undefined
no seu tipo se não for inicializada.
1let uninitialized: number | undefined;
2console.log(uninitialized); // Outputs: undefined
3
4uninitialized = 5;
5console.log(uninitialized); // Outputs: 5
Escopo de Variáveis
let
e const
têm escopo de bloco, então são válidos apenas dentro do mesmo bloco.
1if (true) {
2 let blockScoped: string = "Block Scoped";
3 console.log(blockScoped); // Outputs: Block Scoped
4}
5// console.log(blockScoped); // Error: blockScoped is out of scope
Levantamento de Variáveis (Hoisting)
Como TypeScript é um superconjunto do JavaScript, ele herda a funcionalidade de levantamento (hoisting) do JavaScript. O levantamento (hoisting) refere-se ao comportamento em que declarações de variáveis e funções são tratadas como se fossem elevadas ao topo de seu escopo. No entanto, apenas a declaração é elevada, enquanto a inicialização permanece no local. Variáveis declaradas com var
são elevadas, mas usar let
ou const
antes da declaração resulta em um erro.
1console.log(a); // undefined
2var a = 10;
3console.log(a); // 10
- Neste caso, variáveis declaradas com
var
são elevadas, e seus valores são exibidos.
1console.log(b); // ReferenceError
2let b = 20;
- Variáveis declaradas com
let
não são elevadas, resultando em um erro.
Resumo
O seguinte é um resumo de let
, const
e var
.
let
pode ser reatribuído e tem escopo de bloco.const
não pode ser reatribuído e tem escopo de bloco.var
pode ser reatribuído e tem escopo de função.- Todos eles permitem anotação de tipo explícita para especificar tipos de variável.
Caracteres de Escape em TypeScript
Os caracteres de escape são usados quando caracteres específicos não podem ser inseridos diretamente ou para representar caracteres que possuem significado especial dentro de uma string. No TypeScript, os caracteres de escape são usados para representar caracteres de controle ou caracteres especiais.
Por exemplo, use \n
para exibir uma mensagem que inclua uma nova linha.
1const message: string = "Hello,\nWorld!";
2console.log(message);
3// Output:
4// Hello,
5// World!
Escapando Caracteres Especiais
Os caracteres de escape também são úteis ao incluir caracteres especiais em uma string. Por exemplo, talvez você queira usar aspas duplas ou aspas simples diretamente dentro de uma string.
1const singleQuoteExample: string = 'It\'s a beautiful day!';
2console.log(singleQuoteExample);
3// Output: It's a beautiful day!
4
5const doubleQuoteExample: string = "He said, \"Welcome!\"";
6console.log(doubleQuoteExample);
7// Output: He said, "Welcome!"
Escapando a Barra Invertida em Si
Para incluir uma barra invertida em uma string, você precisa escrevê-la como uma barra invertida dupla.
1const path: string = "C:\\Program Files\\MyApp";
2console.log(path);
3// Output: C:\Program Files\MyApp
Escapes de Unicode e Hexadecimal
No TypeScript, pontos de código Unicode podem ser representados usando sequências de escape.
Sequência de Escape Unicode
Você pode representar caracteres Unicode especificando um número hexadecimal de quatro dígitos após \u
.
1const smileyFace: string = "\u263A";
2console.log(smileyFace);
3// Output: ☺ (Copyright Mark)
Escape Hexadecimal
Você pode representar caracteres específicos usando um número hexadecimal de dois dígitos após \x
.
1const letterA: string = "\x41";
2console.log(letterA);
3// Output: A
Literals de Template e Escapes
Os literais de template são definidos ao serem delimitados por crases e fornecem uma maneira fácil de criar expressões embutidas ou strings de várias linhas. Caracteres de escape regulares podem ser usados diretamente em literals de template.
1const multiLine: string = `This is
2a multi-line
3string.`;
4console.log(multiLine);
5// Output:
6// This is
7// a multi-line
8// string.
Casos Especiais
No TypeScript, o uso de sequências de escape inválidas dentro de uma string pode resultar em um erro de sintaxe. Portanto, é importante verificar se os caracteres de escape são válidos.
1// Invalid escape sequence
2const invalidString: string = "\xZZ"; // Error
Exemplos Práticos de Uso
Aqui está um exemplo de como construir uma string complexa usando caracteres de escape.
1const jsonExample: string = "{\n\t\"name\": \"John Doe\",\n\t\"age\": 30\n}";
2console.log(jsonExample);
3// Output:
4// {
5// "name": "John Doe",
6// "age": 30
7// }
Neste exemplo, \n
é usado para uma nova linha e \t
é usado para adicionar indentação. Isso torna a estrutura JSON mais fácil de ler.
Resumo
Caracteres de escape são muito importantes ao trabalhar com strings no TypeScript. Quando você deseja incluir caracteres especiais ou de controle em uma string, pode criar strings expressivas usando sequências de escape adequadas. Entender e usar corretamente os caracteres de escape pode melhorar a legibilidade e a manutenção do código.
Versões do TypeScript
Vamos dar uma visão geral das versões do TypeScript aqui.
-
TypeScript 1.0 (2014)
A primeira versão estável do TypeScript. Recursos básicos como tipagem, classes e módulos foram introduzidos.
-
TypeScript 2.0 (2016)
Tipos Não Nulos
,Análise de Fluxo de Controle
,Propriedades Somente Leitura
e o tipoNever
foram introduzidos, aprimorando a inferência de tipos. -
TypeScript 3.0 (2018)
Um sistema de tipos mais flexível foi introduzido, com recursos como
Referências de Projeto
, extensões paraTipos Tupla
e melhorias nosParâmetros Rest
. -
TypeScript 4.0 (2020)
Recursos como
Tipos Tupla Variádicos
, melhorias no editor, inferência de tipos aprimorada eElementos de Tupla Rotulados
foram adicionados para melhorar a experiência de desenvolvimento. -
TypeScript 4.1 (2020)
Tipos Literais de Template
foram introduzidos, tornando a manipulação de tipos de string mais poderosa. -
TypeScript 4.3 (2021)
A adição da palavra-chave
Override
, melhorias nos modificadores de acesso dentro dos construtores e suporte aprimorado para os tipos emWeakMap
eWeakSet
. -
TypeScript 4.5 (2021)
O tipo
Awaited
,ModuleSuffixes
e a compatibilidade aprimorada com módulos ECMAScript foram adicionados. -
TypeScript 5.0 (2023)
Padronização de
Decorators
, melhoria na velocidade de compilação de projetos, aprimoramento do sistema de tipos e suporte para os mais recentes recursos do ECMAScript foram realizados.
O TypeScript está em constante evolução, com várias versões lançadas a cada ano, trazendo novos recursos e melhorias.
Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.