Skip to content

Commit 7f0dd23

Browse files
committed
Add TS for JS Programmers.md
1 parent e72e36f commit 7f0dd23

File tree

1 file changed

+288
-0
lines changed

1 file changed

+288
-0
lines changed
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
---
2+
title: TypeScript para programadores JavaScript
3+
short: TypeScript para programadores JavaScript
4+
layout: docs
5+
permalink: /pt/docs/handbook/typescript-in-5-minutes.html
6+
oneline: Aprenda como o TypeScript extende o JavaScript
7+
---
8+
9+
TypeScript tem uma relação incomum com JavaScript. TypeScript oferece todas as features do JavaScript, e uma camada adicional no topo deste: o sistema de tipos do TypeScript.
10+
11+
Por exemplo, JavaScript oferece primitivos de linguagem como `string` e `number`, mas não checa consistentemente que você atribuiu estes. TypeScript checa.
12+
13+
Isso significa que seu código JavaScript existente também é código TypeScript. O benefício principal do TypeScript é que ele pode destacar comportamento inesperado no seu código, diminuindo a chance de bugs.
14+
15+
Este tutorial fornece um resumo do TypeScript, focando no seu sistema de tipos.
16+
17+
## Tipos por Inferência
18+
19+
TypeScript conhece a linguagem JavaScript e vai gerar tipos para você em muitos casos. Por exemplo quando criando uma variável e atribuindo à um determinado valor, TypeScript usará o valor como seu tipo.
20+
21+
```ts twoslash
22+
let olaMundo = 'Olá Mundo';
23+
// ^?
24+
```
25+
26+
Entendendo como o JavaScript funciona, TypeScript pode construir um sistema de tipos que aceita código JavaScript mas tem tipos. Isso oferece um sistema de tipos sem a necessidade de adicionar caracteres extra para fazer com que os tipos sejam explícitos no seu código. É assim que o TypeScript sabe que `olaMundo` é uma `string` no exemplo acima.
27+
28+
Você já pode ter escrito código JavaScript no Visual Studio Code, e teve auto-complete do editor. Visual Studio Code usa TypeScript por baixo dos panos para tornar mais fácil o trabalho com JavaScript.
29+
30+
## Definindo Tipos
31+
32+
Você pode usar uma ampla variedade de tipos de padrões de projetos no JavaScript. Entretanto, alguns padrões de projeto tornam a inferência de tipos automática difícil (por exemplo, padrões que usam programação dinâmica). Para cobrir estes casos, TypeScript suporta uma extensão do JavaScript, que oferece lugares para que você diga ao TypeScript quais deveriam ser os tipos.
33+
34+
Por exemplo, para criar um objteo com um tipo inferido que inclui `name: string` e `id: number`, você pode escrever:
35+
36+
```ts twoslash
37+
const usuario = {
38+
nome: 'Hayes',
39+
id: 0
40+
};
41+
```
42+
43+
Você pode explicitamente descrever a forma desse objeto usando uma declaração de `interface`:
44+
45+
```ts twoslash
46+
interface Usuario {
47+
nome: string;
48+
id: number;
49+
}
50+
```
51+
52+
Você pode então declarar um objeto JavaScript conforme o formato da sua nova `interface` usando a sintaxe `: TypeName` depois da declaração de uma variável:
53+
54+
```ts twoslash
55+
interface Usuario {
56+
nome: string;
57+
id: number;
58+
}
59+
// ---cut---
60+
const usuario: Usuario = {
61+
nome: 'Hayes',
62+
id: 0
63+
};
64+
```
65+
66+
Se você fornecer um objeto que não corresponde a interface que você forneceu, o TypeScript vai te alertar:
67+
68+
```ts twoslash
69+
// @errors: 2322
70+
interface Usuario {
71+
nome: string;
72+
id: number;
73+
}
74+
75+
const usuario: Usuario = {
76+
nomeDeUsuario: 'Hayes',
77+
id: 0
78+
};
79+
```
80+
81+
Já que o JavaScript suporta classes e programação orientada a objeto, TypeScript também. Você pode usar a declaração de interface com classes:
82+
83+
```ts twoslash
84+
interface Usuario {
85+
nome: string;
86+
id: number;
87+
}
88+
89+
class UsuarioConta {
90+
nome: string;
91+
id: number;
92+
93+
constructor(nome: string, id: number) {
94+
this.nome = nome;
95+
this.id = id;
96+
}
97+
}
98+
99+
const usuario: Usuario = new UsuarioConta('Murphy', 1);
100+
```
101+
102+
Você pode usar interfaces para tipar parâmetros e valores de retorno em funções:
103+
104+
```ts twoslash
105+
// @noErrors
106+
interface Usuario {
107+
nome: string;
108+
id: number;
109+
}
110+
// ---cut---
111+
function buscarUsuarioAdmin(): Usuario {
112+
//...
113+
}
114+
115+
function deletarUsuario(usuario: Usuario) {
116+
// ...
117+
}
118+
```
119+
120+
Já há um pequeno conjunto de tipos primitivos disponíveis em JavaScript: `boolean`, `bigint`, `null`, `number`, `string`, `symbol`, e `undefined`, que você pode usar em uma interface. TypeScript extende essa lista com mais alguns como `any` (permitir qualquer coisa), [`unknown`](/play#example/unknown-and-never) (garanta que alguém usando esse tipo declare qual tipo é), [`never`](/play#example/unknown-and-never) (não é possível que esse tipo aconteça), e `void` (uma função que retorna `undefined` ou que não tem valor de retorno).
121+
122+
Você verá que há duas sintaxes para construir tipos: [Interfaces e Types](/play/?e=83#example/types-vs-interfaces). Você deve preferir `interface`. Use `type` quando precisar de funcionalidades específicas.
123+
124+
## Compondo Tipos
125+
126+
Com TypeScript, você pode criar tipos complexos combinando os simples. Existem duas formas populares de fazer isso: com uniões, e com genéricos.
127+
128+
### Uniões
129+
130+
Com uma união, você pode declarar que um tipo pode ser um de muitos. Por exemplo, você pode descrever um tipo `boolean` como sendo `true` ou `false`:
131+
132+
```ts twoslash
133+
type MeuBooleano = true | false;
134+
```
135+
136+
_Nota:_ se você passar o mouse por cima do `MeuBoleano` acima, você verá que é classificado como `boolean`. Essa é uma propriedade do Sistema de Tipos Estruturais. Mais sobre isso abaixo.
137+
138+
Um caso de uso popular de tipos uniões é para descrever o valor que um conjunto de [literais](/docs/handbook/2/everyday-types.html#literal-types) de `string` ou `number` pode ter:
139+
140+
```ts twoslash
141+
type EstadoDaJanela = 'aberto' | 'fechado' | 'minimizado';
142+
type EstadosDeBloqueio = 'trancado' | 'destrancado';
143+
type NumerosImparesMenoresQue10 = 1 | 3 | 5 | 7 | 9;
144+
```
145+
146+
Uniões fornecem uma forma de gerenciar tipos diferentes também. Por exemplo, você pode ter uma função que recebe como argumento um `array` ou uma `string`:
147+
148+
```ts twoslash
149+
function buscarComprimento(obj: string | string[]) {
150+
return obj.length;
151+
}
152+
```
153+
154+
Para saber o tipo de uma variável, use `typeof`:
155+
156+
| Tipo | Predicado |
157+
| --------- | ---------------------------------- |
158+
| string | `typeof s === "string"` |
159+
| number | `typeof n === "number"` |
160+
| boolean | `typeof b === "boolean"` |
161+
| undefined | `typeof undefined === "undefined"` |
162+
| function | `typeof f === "function"` |
163+
| array | `Array.isArray(a)` |
164+
165+
Por exemplo, você pode fazer uma função retornar diferentes tipos dependendo se uma string ou um array forem passados:
166+
167+
<!-- prettier-ignore -->
168+
```ts twoslash
169+
function envolverEmArray(obj: string | string[]) {
170+
if (typeof obj === "string") {
171+
return [obj];
172+
// ^?
173+
}
174+
return obj;
175+
}
176+
```
177+
178+
### Genéricos
179+
180+
Genéricos fornecem variáveis para tipos. Um exemplo comum é um array. Um array sem genéricos pode conter qualquer coisa. Um array com genéricos pode descrever os valores que aquele array contém.
181+
182+
```ts
183+
type ArrayDeStrings = Array<string>;
184+
type ArrayDeNumeros = Array<number>;
185+
type ObjetoComNomeArray = Array<{ nome: string }>;
186+
```
187+
188+
Você pode declarar seus próprios tipos usando genéricos:
189+
190+
```ts twoslash
191+
// @errors: 2345
192+
interface Mochila<Tipo> {
193+
adicionar: (obj: Tipo) => void;
194+
buscar: () => Tipo;
195+
}
196+
197+
// Esse é um atalho para dizer ao Typescript que há uma
198+
// constante chamada mochila, e não se preocupar de onde ela veio.
199+
declare const mochila: Mochila<string>;
200+
201+
// objeto é uma string, porque nós o declaramos acima como a parte variável de Mochila.
202+
const objeto = mochila.buscar();
203+
204+
// Já que a variável mochila é uma string, você não pode passar um número para a função adicionar.
205+
mochila.adicionar(23);
206+
```
207+
208+
## Sistema de Tipos Estruturais
209+
210+
Um dos princípios centrais do TypeScript é que a checagem de tipo é focada no _formato_ que os valores têm. Isso é chamado as vezes de "tipagem do pato" ou "tipagem estrutural".
211+
212+
Em um sistema de tipagem estruturado, se dois objetos tem o mesmo formato, eles são considerados do mesmo tipo.
213+
214+
```ts twoslash
215+
interface Ponto {
216+
x: number;
217+
y: number;
218+
}
219+
220+
function exibirPonto(p: Ponto) {
221+
console.log(`${p.x}, ${p.y}`);
222+
}
223+
224+
// exibe "12, 26"
225+
const ponto = { x: 12, y: 26 };
226+
exibirPonto(ponto);
227+
```
228+
229+
A variável `ponto` nunca é declarada como sendo do tipo `Ponto`. Entretanto, o TypeScript compara o formato de `ponto` ao formato de `Ponto` na checagem de tipo. Eles têm o mesmo formato, então o código passa.
230+
231+
A correspondência de tipo só requere que um subconjunto de campos do objeto sejam correspondentes:
232+
233+
```ts twoslash
234+
// @errors: 2345
235+
interface Ponto {
236+
x: number;
237+
y: number;
238+
}
239+
240+
function exibirPonto(p: Ponto) {
241+
console.log(`${p.x}, ${p.y}`);
242+
}
243+
// ---cut---
244+
const ponto3 = { x: 12, y: 26, z: 89 };
245+
exibirPonto(ponto3); // logs "12, 26"
246+
247+
const rect = { x: 33, y: 3, largura: 30, altura: 80 };
248+
exibirPonto(rect); // logs "33, 3"
249+
250+
const color = { hex: '#187ABF' };
251+
exibirPonto(color);
252+
```
253+
254+
Não há diferença entre como as classes e os objetos se conformam aos formatos:
255+
256+
```ts twoslash
257+
// @errors: 2345
258+
interface Ponto {
259+
x: number;
260+
y: number;
261+
}
262+
263+
function exibirPonto(p: Ponto) {
264+
console.log(`${p.x}, ${p.y}`);
265+
}
266+
// ---cut---
267+
class PontoVirtual {
268+
x: number;
269+
y: number;
270+
271+
constructor(x: number, y: number) {
272+
this.x = x;
273+
this.y = y;
274+
}
275+
}
276+
277+
const novoPontoV = new PontoVirtual(13, 56);
278+
exibirPonto(novoPontoV); // logs "13, 56"
279+
```
280+
281+
Se o objeto ou classe tem todas as propriedades requeridas, TypeScript dirá que eles são correspondentes, independente dos detalhes de implementação.
282+
283+
## Próximos Passos
284+
285+
Essa documentação é uma resumo de alto nível da sintaxe e tipos qeu você usaria em código no dia-a-dia. Daqui você deve:
286+
287+
- Ler o Handbook completo [from start to finish](/docs/handbook/intro.html) (30m)
288+
- Explorar os [exemplos do Playground](/play#show-examples)

0 commit comments

Comments
 (0)