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); }} />  {}}>  Adicionar Item     );
};
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;

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); }} />   Adicionar Item     );
};
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;

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 .

Source link