Usando TypeScript
TypeScript é uma linguagem que estende JavaScript adicionando definições de tipo. Novos projetos React Native são direcionados ao TypeScript por padrão, mas também oferecem suporte a JavaScript e Flow.
Introdução ao TypeScript
Novos projetos criados pela CLI React Native ou modelos populares como Ignite usarão TypeScript por padrão.
O TypeScript também pode ser usado com o Expo, que mantém modelos TypeScript, ou solicitará que você instale e configure automaticamente o TypeScript quando um arquivo .ts
ou .tsx
for adicionado ao seu projeto.
npx create-expo-app --template
Adicionando TypeScript a um projeto existente
- Adicione plug-ins TypeScript, tipos e ESLint ao seu projeto.
npm install -D @tsconfig/react-native @types/jest @types/react @types/react-test-renderer typescript
yarn add --dev @tsconfig/react-native @types/jest @types/react @types/react-test-renderer typescript
OBSERVAÇÃO
Este comando adiciona a versão mais recente de cada dependência. As versões podem precisar ser alteradas para corresponder aos pacotes existentes usados pelo seu projeto. Você pode usar uma ferramenta como React Native Upgrade Helper para ver as versões fornecidas pelo React Native.
- Adicione um arquivo de configuração TypeScript. Crie um
tsconfig.json
na raiz do seu projeto:
{
"extends": "@tsconfig/react-native/tsconfig.json"
}
- Renomeie um arquivo JavaScript para *.tsx
ATENÇÃO
Você deve deixar o arquivo de ponto de entrada ./index.js
como está, caso contrário, poderá ter problemas ao agrupar uma construção de produção.
- Execute o
yarn tsc
para verificar o tipo de seus novos arquivos TypeScript.
Usando JavaScript em vez de TypeScript
O React Native padroniza novos aplicativos para TypeScript, mas JavaScript ainda pode ser usado. Arquivos com extensão .jsx
são tratados como JavaScript em vez de TypeScript e não serão verificados. Módulos JavaScript ainda podem ser importados por módulos TypeScript, junto com o inverso.
Como funcionam o TypeScript e o React Native
Pronto para uso, os códigos TypeScript são transformados pelo Babel durante o empacotamento. Recomendamos que você use o compilador TypeScript apenas para verificação de tipo. Este é o comportamento padrão do tsc
para aplicativos recém-criados. Se você tiver código TypeScript existente sendo portado para React Native, há uma ou duas advertências ao usar Babel em vez de TypeScript.
Qual é a aparência do React Native + TypeScript
Você pode fornecer uma interface para Props e State de um componente React via React.Component<Props, State>
que fornecerá verificação de tipo e preenchimento automático do editor ao trabalhar com esse componente em JSX.
// components/Hello.tsx
import React from 'react';
import {Button, StyleSheet, Text, View} from 'react-native';
export type Props = {
name: string;
baseEnthusiasmLevel?: number;
};
const Hello: React.FC<Props> = ({
name,
baseEnthusiasmLevel = 0,
}) => {
const [enthusiasmLevel, setEnthusiasmLevel] = React.useState(
baseEnthusiasmLevel,
);
const onIncrement = () =>
setEnthusiasmLevel(enthusiasmLevel + 1);
const onDecrement = () =>
setEnthusiasmLevel(
enthusiasmLevel > 0 ? enthusiasmLevel - 1 : 0,
);
const getExclamationMarks = (numChars: number) =>
numChars > 0 ? Array(numChars + 1).join('!') : '';
return (
<View style={styles.container}>
<Text style={styles.greeting}>
Hello {name}
{getExclamationMarks(enthusiasmLevel)}
</Text>
<View>
<Button
title="Increase enthusiasm"
accessibilityLabel="increment"
onPress={onIncrement}
color="blue"
/>
<Button
title="Decrease enthusiasm"
accessibilityLabel="decrement"
onPress={onDecrement}
color="red"
/>
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
greeting: {
fontSize: 20,
fontWeight: 'bold',
margin: 16,
},
});
export default Hello;
Você pode explorar mais a sintaxe no playground TypeScript.
Onde encontrar conselhos úteis
- Manual TypeScript
- Documentação do React no TypeScript
- React + TypeScript Cheatsheets tem uma boa visão geral sobre como usar React com TypeScript
Usando aliases de caminho personalizados com TypeScript
Para usar aliases de caminho personalizados com TypeScript, você precisa definir os aliases de caminho para funcionarem tanto no Babel quanto no TypeScript. Veja como:
- Edite seu
tsconfig.json
para ter seus mapeamentos de caminho personalizados. Defina qualquer coisa na raiz desrc
para estar disponível sem nenhuma referência de caminho anterior e permita que qualquer arquivo de teste seja acessado usandotests/File.tsx
:
{
"extends": "@tsconfig/react-native/tsconfig.json"
"extends": "@tsconfig/react-native/tsconfig.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"*": ["src/*"],
"tests": ["tests/*"],
"@components/*": ["src/components/*"],
},
}
}
Adicione babel-plugin-module-resolver como um pacote de desenvolvimento ao seu projeto:
npm install --save-dev babel-plugin-module-resolver
yarn add --dev babel-plugin-module-resolver
Por fim, configure seu babel.config.js
(observe que a sintaxe do seu babel.config.js
é diferente do seu tsconfig.json
):
{
presets: ['module:metro-react-native-babel-preset'],
plugins: [
[
'module-resolver',
{
root: ['./src'],
extensions: ['.ios.js', '.android.js', '.js', '.ts', '.tsx', '.json'],
alias: {
tests: ['./tests/'],
"@components": "./src/components",
}
}
]
]
}