diff --git a/packages/documentation/copy/pt/reference/JSX.md b/packages/documentation/copy/pt/reference/JSX.md new file mode 100644 index 000000000000..cfa6641af14d --- /dev/null +++ b/packages/documentation/copy/pt/reference/JSX.md @@ -0,0 +1,435 @@ +--- +title: JSX +layout: docs +permalink: /pt/docs/handbook/jsx.html +oneline: Utilizando JSX com TypeScript +translatable: true +--- + +[JSX](https://facebook.github.io/jsx/) é uma sintaxe semelhante a um XML incorporável. +Ele deve ser transformado em JavaScript válido, embora a semântica dessa transformação seja específica da implementação. +JSX ganhou popularidade com o framework [React](https://reactjs.org/), mas desde então viu outras implementações também. +TypeScript suporta incorporação, verificação de tipo, e compilação de JSX diretamente para JavaScript. + +## Uso básico + +Para usar JSX, você deve fazer duas coisas. + +1. Nomeie seus arquivos com extensão `.tsx` +2. Ativar a opção `jsx` + +TypeScript vem com três modos JSX: `preserve`, `react`, e `react-native`. +Esses modos afetam apenas o estágio de emissão - verificação de tipo não é afetada. +O modo `preserve` manterá o JSX como parte da output para ser posteriormente consumido por outra etapa de transformação (e.g. [Babel](https://babeljs.io/)). +Além disso, a output terá uma extensão de arquivo `.jsx`. +O modo `react` vai emitir `React.createElement`, não precisa passar por uma transformação JSX antes de usar, e a saída terá uma extensão de arquivo `.js`. +O modo `react-native` é o equivalente ao modo `preserve` no sentido de que mantém todos os JSX, mas a saída terá uma extensão de arquivo `.js`. + +| Modo | Input | Output | Output File Extension | +| -------------- | --------- | ------------------------------------------------- | --------------------- | +| `preserve` | `
` | `
` | `.jsx` | +| `react` | `
` | `React.createElement("div")` | `.js` | +| `react-native` | `
` | `
` | `.js` | +| `react-jsx` | `
` | `_jsx("div", {}, void 0);` | `.js` | +| `react-jsxdev` | `
` | `_jsxDEV("div", {}, void 0, false, {...}, this);` | `.js` | + +Você pode especificar esse modo usando tanto a flag na linha de comando `--jsx` ou a opção [`jsx` correspondente no seu arquivo tsconfig.json](/tsconfig#jsx). + +> \*Nota: Você pode especificar a função factory JSX para usar quando direcionar react JSX com a opção `--jsxFactory` (padrão para `React.createElement`) + +## O operador `as` + +Observe como escrever uma declaração de tipo: + +```ts +var foo = bar; +``` + +Isso afirma que a variável `bar` tem o tipo `foo`. +Uma vez que o TypeScript também usa colchetes angulares para afirmações de tipo, combiná-lo com a sintaxe JSX apresentaria certas dificuldades de análise. Como resultado, o TypeScript não permite afirmações do tipo colchete angular em arquivos `.tsx`. + +Uma vez que a sintaxe acima não pode ser usada em arquivos `.tsx`, um operador de asserção de tipo alternativo deve ser usado: `as`. +O exemplo pode ser facilmente reescrito com o operador `as`. + +```ts +var foo = bar as foo; +``` + +O operador `as` está disponívem em ambos arquivos `.ts` e `.tsx`, e é idêntico em comportamento ao estilo de asserção do tipo colchete angular. + +## Verificação de tipos + +Para entender a verificação de tipo com JSX, você deve primeiro entender a diferença entre os elementos intrínsecos e os elementos baseados em valores. +Dada uma expressão JSX ``, `expr` pode se referir a algo intrínseco ao ambiente (e.g. uma `div` ou `span` em um ambiente DOM) ou a um componente personalizado que você criou. +Isto é importante por duas razões: + +1. Para React, os elementos intrínsecos são emitidos como strings (`React.createElement("div")`), enquanto um componente que você criou não é (`React.createElement(MyComponent)`). +2. Os tipos de atributos passados no elemento JSX devem ser pesquisados de forma diferente. + Atributos de elementos intrínsecos devem ser conhecidos _intrinsicamente_, enquanto os componentes provavelmente desejarão especificar seu próprio conjunto de atributos. + +TypeScript usa a [mesma convenção que React usa](http://facebook.github.io/react/docs/jsx-in-depth.html#html-tags-vs.-react-components) para distinguir entre estes. +Um elemento intrínseco sempre começa com uma letra minúscula e um elemento baseado em valor sempre começa com uma letra maiúscula. + +## Elementos intrínsecos + +Os elementos intrínsecos são pesquisados na interface especial `JSX.IntrinsicElements`. +Por padrão, se esta interface não for especificada, então vale tudo e os elementos intrínsecos não serão verificados por tipo. +No entanto, se esta interface _estiver_ presente, então o nome do elemento intrínseco é procurado como uma propriedade na interface `JSX.IntrinsicElements`. +Por exemplo: + +```ts +declare namespace JSX { + interface IntrinsicElements { + foo: any; + } +} + +; // ok +; // erro +``` + +No exemplo acima, `` vai funcionar bem, mas `` resultará em um erro, pois não foi especificado em `JSX.IntrinsicElements`. + +> Nota: Você também pode especificar um indexador de string abrangente em `JSX.IntrinsicElements` do seguinte modo: + +```ts +declare namespace JSX { + interface IntrinsicElements { + [elemName: string]: any; + } +} +``` + +## Elementos baseados em valor + +Os elementos baseados em valor são simplesmente pesquisados por identificadores que estão no escopo. + +```ts +import MyComponent from "./myComponent"; + +; // ok +; // erro +``` + +Existem duas maneiras de definir um elemento baseado em valor: + +1. Function Component (FC) +2. Class Component + +Como esses dois tipos de elementos baseados em valor são indistinguíveis um do outro em uma expressão JSX, primeiro o TS tenta resolver a expressão como um componente de função usando resolução de sobrecarga. Se o processo for bem-sucedido, o TS termina de resolver a expressão para sua declaração. Se o valor não resolver como um componente de função, o TS tentará resolvê-lo como um componente de classe. Se isso falhar, o TS relatará um erro. + +### Function Component + +Como o nome sugere, o componente é definido como uma função JavaScript em que seu primeiro argumento é um objeto `props`. +TS impõe que seu tipo de retorno deve ser atribuível a `JSX.Element`. + +```ts +interface FooProp { + name: string; + X: number; + Y: number; +} + +declare function AnotherComponent(prop: { name: string }); +function ComponentFoo(prop: FooProp) { + return ; +} + +const Button = (prop: { value: string }, context: { color: string }) => ( +