|
| 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