Não há dúvida de que TypeScript se tornou o favorito de muitos desenvolvedores e com mais de 19 milhões de downloads semanais em npm
, há uma chance de você ver o Typescript em duas de cada três descrições de trabalho relacionadas ao JavaScript.
Neste artigo, veremos como usar o TypeScript em seus aplicativos React Native. Ao final deste artigo, você se sentirá confortável o suficiente para aproveitar as vantagens do TypeScript para minimizar erros e adicionar verificação de tipo ao seu aplicativo.
O que é TypeScript?
TypeScript é uma linguagem de código aberto construída sobre JavaScript pela Microsoft. Você pode pensar em TypeScript como JavaScript, mas com definições de tipo estático.
Por que você deve considerar o TypeScript
Se os dois primeiros parágrafos deste artigo não forem convincentes o suficiente para levá-lo a experimentar o TypeScript, aqui estão mais alguns motivos:
- Melhor documentação: com tipos claramente definidos, você pode saber facilmente como fazer referência a outras partes de seu código
- Redução de erros: o TypeScript pode validar seu código antes da execução, economizando muito tempo ao depurar por que “undefined não é uma função na linha 23”
- Compila para JavaScript: como o TypeScript é um superconjunto de JavaScript, ele compila para JavaScript, e todo JavaScript válido é um TypeScript válido
- Fácil adoção: se você sempre quis adicionar TypeScript a seus aplicativos JavaScript existentes, pode facilmente começar com um arquivo e ver como funciona a partir daí
Construindo um aplicativo com React Native e TypeScript
Agora que sabemos o que é TypeScript, podemos começar a ver como usá-lo em nossos aplicativos React Native.
Neste tutorial, vamos construir um aplicativo de lista de compras. Esta é uma ótima maneira de ver como o TypeScript pode melhorar sua experiência de desenvolvedor sem que as coisas fiquem muito complexas.
Requisitos
- Conhecimento básico de execução de comandos CLI
- Node.js e npm instalados em sua máquina
- XCode ou Android Studio instalado em sua máquina
- Conhecimento básico de JavaScript
- Conhecimento básico de React
- Alguma experiência com React Native (sugerido, não obrigatório)
Primeiros passos
Vamos começar, sim? Execute o comando abaixo em seu terminal:
npx react-native init ShoppingList--template react-native-template-typescript
O comando acima configurará um novo projeto React Native usando um modelo TypeScript com as dependências e configurações necessárias em uma pasta chamada ShoppingList
.
Para saber como você pode usar o TypeScript em um aplicativo existente, dê uma olhada no documentos .
Construindo a IU de base
Abra a pasta em seu editor de código e execute os comandos abaixo (dependendo de sua máquina) para iniciar o projeto:
# MacOS npm run ios # Windows/Linux npm executar android
O componente App.tsx
é o componente raiz em nosso aplicativo. Este componente conterá outros componentes que usamos no aplicativo e voltaremos a ele em breve. Por enquanto, vamos criar nosso primeiro componente.
Crie uma estrutura de pastas como src/components
no diretório raiz e crie um componente Header.tsx
na pasta components
.
Você percebeu que os arquivos que estamos criando têm uma extensão .tsx
? Isso porque agora estamos construindo com TypeScript e precisamos usar as extensões de arquivo adequadas, caso contrário, obteremos erros nos arquivos .js
regulares.
Cole o código abaixo no arquivo:
import React from'react'; import {View, Text, StyleSheet} from'react-native'; interface Props { título: string; } const Header: React.FC=({title})=> { Retorna ( {title} ); }; estilos const=StyleSheet.create ({ cabeçalho: { paddingVertical: 20, borderBottomWidth: 1, borderBottomColor:'#cfcfcf', alignItems:'center', }, headerText: { fontSize: 20, fontWeight:'600', }, }); exportar cabeçalho padrão;
Se você já está familiarizado com o React Native, ignore a maior parte do código acima; você saberá o que estamos tentando fazer aqui. No entanto, gostaria de chamar sua atenção para as linhas 3-6:
interface Props { título: string; } const Header: React.FC=({title})=> {/* conteúdo aqui */}
Como estamos usando o TypeScript, agora podemos definir o que nosso componente deve receber, como deve ser absorvido e quantos devemos receber.
Nas primeiras três linhas, declaramos uma interface , que serve como estrutura para o objeto props
que normalmente acessaríamos em nosso componente. No entanto, desta vez, estamos especificando os adereços e seus tipos usando TypeScript.
A vantagem de fazer isso dessa maneira é que obtemos um IntelliSense melhor e alguma validação quando usaremos o componente (por exemplo, quando o título
não é passado para o componente, haverá um erro instantâneo).
De volta ao componente App.tsx
, substitua o conteúdo pelo código abaixo:
import React from'react'; import {SafeAreaView, StyleSheet, Text, View} de'react-native'; import Header from'./src/components/Header'; const App=()=> { Retorna (); }; estilos const=StyleSheet.create ({ container: { flex: 1, backgroundColor:'# e8e7e3', }, }); exportar aplicativo padrão;
Você deve notar uma linha vermelha sob o componente
. Se você passar o mouse sobre ele, verá uma mensagem de que o componente espera um prop title
que não foi fornecido. Vamos fazer isso agora.
Substitua essa linha pelo snippet de código abaixo e você verá que o erro desapareceu:
Se você tentou atribuir um número (ou qualquer outro tipo de dado que não seja uma string), obterá um erro diferente. Este é o TypeScript tentando ajudá-lo a detectar bugs antes que eles aconteçam.
Adicionando itens à lista
Crie um novo componente, AddItem.tsx
, em sua pasta /src/components
e cole o código abaixo:
import React, {useState} de'react'; import { Visualizar, Texto, TextInput, TouchableOpacity, StyleSheet, } de'react-native'; interface de exportação IItem { item: string; quantidade: string; } const AddItem=()=> { const [item, setItem]=useState (''); const [quantidade, setQuantity]=useState (''); Retorna (Adicionar item de compra setItem (texto)} /> { setQuantity (q); }} /> {}}> ); }; estilos const=StyleSheet.create ({ cabeçalho: { fontSize: 20, fontWeight:'700', }, Formato: { marginTop: 30, }, entrada: { preenchimento: 15, borderColor:'rgba (0, 0, 0, 0,2)', borderWidth: 1, borderRadius: 5, marginBottom: 20, }, addItemButton: { backgroundColor:'# eb8634', paddingVertical: 20, borderRadius: 5, alignItems:'center', }, buttonText: {color:'#fff', fontWeight:'500'}, }); exportar AddItem padrão;Adicionar Item
Observe a exportação nomeada IItem
na linha 9? Essa é a estrutura de um item em nossa lista de compras, e nós a exportamos porque vamos precisar dela em outros componentes.
Voltar para App.tsx
, atualize o componente com o código abaixo:
import React, {useState} de'react'; import {SafeAreaView, StyleSheet, Text, View} de'react-native'; import Header from'./src/components/Header'; importar AddItem, {IItem} de'./src/components/AddItem';/* import AddItem and interface */ const App=()=> { const [shoppingList, setShoppingList]=useState([]);//define o tipo do que o gancho espera ser um array de itens. Retorna ( ); }; estilos const=StyleSheet.create ({ container: { flex: 1, backgroundColor:'# e8e7e3', }, contentWrapper: { preenchimento: 20, }, }); exportar aplicativo padrão;
Agora em App.tsx
importamos o novo componente AddItem
e a interface IItem
para que possamos usar (na linha 6) o useState
hook para criar o estado shoppingList
.
Especificamos que o gancho deve aceitar um array de IItem
ao usar a função setShoppingList
. Se você passar o mouse sobre a função setShoppingList
, verá o tipo. Observe isso, vamos precisar disso em breve, quando adicionarmos itens à lista de compras em AddItem.tsx
.
Volte para o componente AddItem.tsx
e atualize-o com este:
import React, {useState} de'react'; import { Visualizar, Texto, TextInput, TouchableOpacity, StyleSheet, Alerta, } de'react-native'; interface de exportação IItem { item: string; quantidade: string; } interface Props { setShoppingList: React.Dispatch>; shoppingList: IItem []; } const AddItem: React.FC =({shoppingList, setShoppingList})=> { const [item, setItem]=useState (''); const [quantidade, setQuantity]=useState (''); const addItem=()=> { if (! item) { Alert.alert ('Nenhum item!','Você precisa inserir um item'); } senão { setShoppingList ([ ...lista de compras, { item, quantidade: quantidade ||'1', }, ]); setItem (''); setQuantity (''); } }; Retorna ( Adicionar item de compra setItem (texto)} /> { setQuantity (q); }} /> ); }; estilos const=StyleSheet.create ({ cabeçalho: { fontSize: 20, fontWeight:'700', }, Formato: { marginTop: 30, }, entrada: { preenchimento: 15, borderColor:'rgba (0, 0, 0, 0,2)', borderWidth: 1, borderRadius: 5, marginBottom: 20, }, addItemButton: { backgroundColor:'# eb8634', paddingVertical: 20, borderRadius: 5, alignItems:'center', }, buttonText: {color:'#fff', fontWeight:'500'}, }); exportar AddItem padrão; Adicionar Item
Há mudanças significativas no componente agora, então vou orientá-lo por meio delas.
Na linha 14, definimos a interface Props
e configuramos o tipo de cada propriedade e, em seguida, definimos como o tipo de props
em nosso componente funcional na linha 18.
Também criamos uma função de manipulador na linha 21, quando o botão “Adicionar item” é clicado, a função verifica se um item foi inserido no campo e invoca a função setShoppingList ()
para adicione um novo item à lista.
Listando itens
Agora que podemos adicionar novos itens, vamos criar um componente para listá-los.
Crie outro arquivo em /src/components
chamado Item.tsx
e cole o código abaixo dentro:
import React from'react'; import {View, Text, StyleSheet} from'react-native'; importar {IItem} de'./AddItem'; Item const: React.FC=({item, quantidade})=> { Retorna ( {item} x {quantidade} ); }; estilos const=StyleSheet.create ({ item: { preenchimento: 20, flexDirection:'row', justifyContent:'espaço entre', alignItems:'center', borderBottomWidth: 1, borderBottomColor:'rgba (0, 0, 0, 0.2)', }, nome do item: { fontWeight:'500', }, quantidade: { preenchimento: 6, borderWidth: 1, borderColor:'rgba (0, 0, 0, 0,2)', borderRadius: 10, estouro:'escondido', backgroundColor:'rgba (0, 0, 0, 0,05)', }, }); exportar item padrão;
Você provavelmente já pegou o jeito! O componente Item.tsx
aceita propriedades de IItem
como adereços e, em seguida, os renderizamos com algum estilo.
Agora precisamos terminar o aplicativo importando o componente para App.tsx
e listando os itens usando a [FlatList] integrada ( https://reactnative.dev/docs/flatlist )
componente.
Substitua o conteúdo do App.tsx
pelo código abaixo:
import React, {useState} de'react'; importar {SafeAreaView, StyleSheet, View, FlatList} de'react-native'; import Header from'./src/components/Header'; importar AddItem, {IItem} de'./src/components/AddItem'; importar item de'./src/components/Item'; const App=()=> { const [shoppingList, setShoppingList]=useState([]); Retorna ( `$ {item.item}-$ {index}`} renderItem={({item})=> ( - )} /> ); }; estilos const=StyleSheet.create ({ container: { flex: 1, backgroundColor:'# e8e7e3', }, contentWrapper: { preenchimento: 20, }, }); exportar aplicativo padrão;
Nosso aplicativo agora está completo. Na linha 16, usamos o componente FlatList
para renderizar itens de nossa lista, e você pode ver como usamos o componente Item
no renderItem
prop para FlatList
.
Esta é uma demonstração de nosso novo aplicativo:
Conclusão
Este artigo foi criado para ser uma introdução leve sobre como você pode se beneficiar dos recursos do TypeScript em seus aplicativos React Native. O aplicativo da lista de compras era simples o suficiente para mostrar a você como usar o TypeScript sem tornar as coisas complexas.
Você pode ir além implementando um recurso para remover itens da lista.
Saiba mais sobre o TypeScript com a documentação oficial e encontre o código-fonte deste projeto aqui .
A postagem Usando TypeScript com React Native apareceu primeiro em LogRocket Blog .