paint-brush
Como migrar um projeto React de JavaScript para TypeScriptpor@leandronnz
7,489 leituras
7,489 leituras

Como migrar um projeto React de JavaScript para TypeScript

por Leandro Nuñez24m2023/10/19
Read on Terminal Reader

Muito longo; Para ler

Migrar um projeto React de Javascript para TypeScript não é uma mera 'pesquisa e substituição' de arquivos .js por .tsx. É um movimento estratégico que envolve aprender novas convenções, compreender profundamente os tipos e, o mais importante, mudar a maneira como pensamos sobre a confiabilidade e consistência do nosso código. Aqui estão algumas notas: Rede de segurança: TypeScript introduziu uma camada de segurança em nosso projeto, detectando erros antes que eles causem estragos em tempo de execução. Essa rede de segurança, depois que você se acostuma, muda o jogo em termos de confiança em seu código e velocidade geral de desenvolvimento. Comunicação mais clara: com tipos, nosso código agora se comunica de forma mais explícita. Seja você revisitando seu código ou um novo membro da equipe tentando entender as estruturas de seus componentes, o TypeScript serve como uma camada de documentação adicional. Confiança na refatoração: medo de refatorar? Bem, o TypeScript protege você. Com tipos garantindo contratos em seu código, muitos erros potenciais são detectados durante as fases de refatoração, tornando o processo menos assustador. Comunidade e ecossistema: adotar o TypeScript abre portas para um ecossistema próspero. Desde bibliotecas digitadas no DefinitelyTyped até suporte infinito em fóruns da comunidade e integração mais simplificada de pacotes de terceiros, você está em boa companhia. Curva de aprendizado: Sim, o TypeScript apresenta uma curva de aprendizado. Provavelmente houve momentos de frustração, confusões em torno de tipos e interfaces ou dificuldades com o compilador. Mas, reveja sua jornada e verá o quanto você entende melhor seu código e seu comportamento agora.
featured image - Como migrar um projeto React de JavaScript para TypeScript
Leandro Nuñez HackerNoon profile picture
0-item


Índice

  • Introdução

  • Por que migrar? Compreendendo os benefícios

  • Antes de começar: pré-requisitos

  • Iniciando a migração: configurando TypeScript em seu projeto

  • Refatorando componentes do React

  • API de gerenciamento de estado e contexto

  • Roteamento e operações assíncronas

  • Testando em TypeScript

  • Tratamento de pacotes não TypeScript

  • Melhores práticas e armadilhas comuns

  • Conclusão

  • Recursos adicionais



Introdução

Olá, colegas desenvolvedores! É emocionante ver você aqui, pronto para explorar a transição de JavaScript para TypeScript em nossos projetos React.


Agora, se você já trabalhou com JavaScript, sabe que é como aquele par de sapatos velhos e confortáveis – um pouco desgastados, às vezes imprevisíveis, mas familiares. TypeScript, no entanto, é como fazer um upgrade de calçado com palmilhas personalizadas; é a mesma experiência de caminhada, mas com suporte extra.


Então, qual é o burburinho sobre o TypeScript?


Bem, é essencialmente JavaScript, mas com uma boa dose de recursos extras incluídos, sendo o mais significativo a verificação de tipo.


Imagine codificar sem aqueles incômodos erros undefined is not a function que aparecem do nada. Esse é o tipo de paz que o TypeScript traz para sua vida.


Neste guia, explicamos por que e como integrar o TypeScript ao seu projeto React.


Por que reagir? Porque é incrível e nós amamos isso, obviamente. Mas também, combinar a abordagem baseada em componentes do React com os recursos de verificação de tipo do TypeScript proporciona uma experiência de codificação muito eficiente e agradável.


Aqui está uma prévia de como é adicionar TypeScript a um projeto. Em um componente JavaScript típico, você teria:

 // JavaScript way function Greeting({ name }) { return <h1>Hello, {name}</h1>; }


Com o TypeScript, estamos introduzindo uma maneira de garantir que name seja sempre tratado como uma string:

 // TypeScript style type Props = { name: string; }; function Greeting({ name }: Props) { return <h1>Hello, {name}</h1>; }


Observe a parte do type Props ?


Essa é a maneira do TypeScript dizer: "Ei, estou assistindo; é melhor ter certeza de name é uma string!" É uma mudança simples com implicações profundas. Agora você tem um anjo da guarda que evita ativamente bugs relacionados ao tipo, tornando seu código mais robusto e previsível.


Mas isso é apenas um pequeno vislumbre. Há todo um mundo de benefícios e práticas com TypeScript que iremos revelar neste guia abrangente. Desde a configuração do seu ambiente até a refatoração de componentes e adereços, e até mesmo práticas recomendadas para evitar armadilhas comuns, temos muito o que abordar. Então, aperte o cinto e vamos colocar esse show na estrada!




Por que migrar? Compreendendo os benefícios

Se você está pensando em mudar de JavaScript para TypeScript, especialmente em seus projetos React , não está sozinho se perguntando: “Vale realmente a pena se preocupar?” Fazer a transição da linguagem de um projeto inteiro não é uma tarefa fácil; requer esforço, aprendizado e, inicialmente, um pouco de produtividade desacelerada. Então, por que os desenvolvedores fazem a mudança? Vamos analisar as razões convincentes.


1. Detecte erros mais cedo: verificação de tipo estático

O principal recurso do TypeScript é seu sistema de tipos estáticos. Ao contrário do JavaScript, que é digitado dinamicamente, o TypeScript permite especificar tipos para suas variáveis, parâmetros de função e valores retornados. Qual é a vantagem? Erros são detectados durante o desenvolvimento, muito antes de o código chegar perto da produção.


Considere um exemplo simples:

 // In JavaScript function createGreeting(name) { return `Hello, ${name}`; } // You might not catch this typo until runtime const greeting = createGreeting(123); console.log(greeting); // "Hello, 123" - Wait, that's not right!


Agora, vamos ver como o TypeScript ajuda:

 // In TypeScript function createGreeting(name: string): string { return `Hello, ${name}`; } // TypeScript will flag this immediately - '123' is not a string! const greeting = createGreeting(123);


Com o TypeScript, esse bug de aparência inocente seria detectado instantaneamente, garantindo que você estivesse ciente do acidente no momento em que ele ocorresse. Dessa forma, o ciclo de feedback é reduzido e você não fica coçando a cabeça olhando para bugs estranhos em seu ambiente de produção.


2. Melhore a qualidade e a compreensibilidade do código

A imposição de digitação do TypeScript significa que qualquer outro desenvolvedor (ou até mesmo você no futuro) pode entender rapidamente que tipo de dados uma função espera e o que ela retorna. Essa clareza torna as bases de código mais legíveis e autodocumentadas.


Imagine encontrar uma função JavaScript escrita por um colega:

 function calculateTotal(items) { // ... complicated logic ... }


Você provavelmente precisará pesquisar a função ou descobrir onde ela é usada para entender quais items deveriam ser. Com TypeScript, fica imediatamente claro:

 type Item = { price: number; quantity: number; }; // Now we know exactly what to expect! function calculateTotal(items: Item[]): number { // ... complicated logic ... }


3. Suporte aprimorado ao editor

O TypeScript leva a experiência do desenvolvedor a um novo nível, aprimorando editores de texto e IDEs com preenchimento automático, refatoração e depuração aprimorados. Essa integração é possível porque o TypeScript pode compartilhar a compreensão do seu código com o seu editor.

Você experimentará isso quando encontrar seu editor sugerindo nomes de métodos, fornecendo informações de parâmetros de função ou avisando sobre o uso incorreto de funções. É como ter um copiloto que ajuda a navegar pelo código com uma camada extra de segurança.


4. Colaboração mais fácil

Em um ambiente de equipe, o TypeScript se destaca ao ajudar a impor certos padrões e estruturas em toda a base de código. Quando vários desenvolvedores contribuem para um projeto, as regras rígidas do TypeScript garantem que todos sigam as mesmas diretrizes de codificação, tornando a colaboração mais tranquila. É uma linguagem comum que fala “qualidade e consistência” em todos os aspectos.


5. Preparando seu código para o futuro

O JavaScript está evoluindo e o TypeScript pretende estar atualizado com os recursos mais recentes. Ao usar o TypeScript, você pode começar a aproveitar a próxima geração de recursos JavaScript antes que eles sejam adotados, garantindo que seu projeto permaneça moderno e de ponta.


Concluindo, migrar para TypeScript não envolve apenas detectar erros mais cedo; trata-se de uma melhoria holística do seu processo de codificação. Desde uma melhor colaboração em equipe até a preparação de seus projetos para o futuro, o TypeScript fornece uma base robusta para a construção de aplicativos confiáveis, escaláveis e de fácil manutenção.


Fazer a mudança pode parecer assustador no início, mas com os benefícios descritos acima, fica claro por que o TypeScript se tornou o favorito de muitos desenvolvedores em todo o mundo. Pronto para mergulhar? Vamos prosseguir!



Antes de começar: pré-requisitos

Tudo bem, então você está pronto para mudar para TypeScript com seu projeto React? Ótima decisão!


Mas antes de mergulharmos no processo real, precisamos ter certeza de que algumas coisas estão em vigor.

Considere esta a nossa fase de preparação, onde preparamos todas as nossas ferramentas para que o processo de transição seja suave como manteiga.


Aqui está o que você precisa ter pronto:

1. Projeto React Existente

Em primeiro lugar, você precisa de um projeto React existente. Este projeto deve ser um projeto com o qual você se sinta confortável em experimentar; embora o processo de migração seja bastante simples, você desejará fazer isso em um espaço onde seja possível fazer bagunças temporárias.


 // Here's a simple React functional component in your project export default function Greeting({ name }) { return <h1>Hello, {name}!</h1>; }


Este componente é um bom ponto de partida - é funcional, limpo e podemos ver rapidamente o que está acontecendo.

2. Compreensão básica do TypeScript

Você não precisa ser um guru do TypeScript, mas entender o básico tornará essa transição muito mais fácil.


Saiba definir tipos, interfaces e saiba a diferença entre type e interface .

Um pouco de lição de casa ajuda muito, acredite em mim.


 // A sneak peek into TypeScript syntax type Props = { name: string; // defining the 'name' expected to be a string }; // Your component in TypeScript would look like this import React, { FC } from 'react'; interface GreetingProps { name: string; } const Greeting: FC<GreetingProps> = ({ name }) => { return <h1>Hello, {name}!</h1>; } export default Greeting;


Veja a diferença? Agora estamos sendo explícitos sobre o que Greeting espera, tornando nosso componente mais previsível e mais fácil de trabalhar.


3. Nó e NPM/Fio

Seu ambiente de desenvolvimento deve ter o Node.js instalado porque usaremos npm ou yarn para lidar com nossos pacotes. Esse requisito é um dado adquirido, já que você está trabalhando com React, mas não há problema em ter certeza, certo?


 # Check if Node is installed node --version # Check if npm is installed npm --version # Or for yarn yarn --version


Seu terminal deve mostrar as versões atuais dessas ferramentas, confirmando que estão todas configuradas e prontas para uso.


4. Editor de código

Você precisará de um editor de código que possa lidar bem com TypeScript. O Visual Studio Code é o favorito do público porque possui suporte robusto a TypeScript integrado, tornando o processo de desenvolvimento mais suave com conclusão inteligente de código e destaque de erros.


5. Controle de versão

Esta etapa não é obrigatória, mas é inteligente. Certifique-se de que seu projeto atual esteja sob controle de versão com git. Se algo der errado (embora tentemos garantir que isso não aconteça), você sempre poderá reverter para uma versão anterior sem perder o sono.


 # Check if git is installed git --version # If not, you need to initialize version control before proceeding git init git add . git commit -m "Pre-TypeScript commit"


Ter esta rede de segurança significa que você pode experimentar com confiança, sabendo que suas costas estão protegidas.


Isso é tudo para nossos pré-requisitos! Você tem o projeto, aprimorou algum TypeScript, seu ambiente está pronto e sua rede de segurança está instalada.


Agora, estamos prontos para mergulhar no processo de migração. Vamos fazer a bola rolar!



Iniciando a migração: configurando TypeScript em seu projeto Refatorando componentes React

Tudo bem, para a próxima fase!


Preparamos o cenário com TypeScript, mas agora precisamos sujar as mãos.


É hora de refatorar nossos componentes React. Esta etapa envolve um pouco mais do que apenas alterar as extensões dos arquivos; precisamos atualizar nosso código de componente para utilizar os recursos do TypeScript para uma experiência de codificação mais robusta e livre de erros.

Vamos mergulhar!


1. Alterando extensões de arquivo

Primeiramente, vamos renomear nossos arquivos componentes. Este processo envolve alterar a extensão de .js para .tsx para arquivos que contêm código JSX.


Veja como você pode fazer isso em massa no diretório de origem do seu projeto a partir da linha de comando:

 # For Unix-like shells, navigate to your source folder and run: find . -name "*.js" -exec bash -c 'mv "$0" "${0%.js}.tsx"' {} \; # If you're using PowerShell (Windows), navigate to your source folder and run: Get-ChildItem -Filter *.js -Recurse | Rename-Item -NewName { $_.Name -replace '\.js$','.tsx' }


Esses comandos procuram todos os arquivos .js no diretório de origem do seu projeto e os renomeiam para .tsx . É como dizer aos seus arquivos: “Bem-vindo ao mundo TypeScript!”


2. Digitando seus componentes

Com nossos arquivos renomeados, vamos abordar o código. Começaremos com um componente funcional simples em JavaScript:

 // Before: MyComponent.js import React from 'react'; function MyComponent({ greeting }) { return <h1>{greeting}, world!</h1>; }


Agora, vamos refatorar isso para usar TypeScript:

 // After: MyComponent.tsx import React, { FC } from 'react'; // Define a type for the component props interface MyComponentProps { greeting: string; } // Use the 'FC' (Functional Component) generic from React, with our props type const MyComponent: FC<MyComponentProps> = ({ greeting }) => { return <h1>{greeting}, world!</h1>; }


O que fizemos aqui?


Definimos uma interface MyComponentProps para descrever os adereços do nosso componente, garantindo a segurança do tipo. Ao dizer greeting é uma string, o TypeScript gritará conosco se tentarmos passar, digamos, um número. Também usamos o tipo FC (abreviação de Functional Component ) nas definições de tipo do React, garantindo que o TypeScript saiba que é um componente do React.


3. Digitar fortemente useState e useEffect

Vamos atualizar ainda mais nossos componentes adicionando tipos aos estados e efeitos, recursos comuns dos componentes funcionais.


Aqui está um componente com estado e efeito:

 // Before: Counter.js import React, { useState, useEffect } from 'react'; function Counter() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }


Vamos espalhar um pouco da magia do TypeScript nisso:

 // After: Counter.tsx import React, { useState, useEffect, FC } from 'react'; const Counter: FC = () => { // Declare the 'count' state variable with TypeScript const [count, setCount] = useState<number>(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(prevCount => prevCount + 1)}> Click me </button> </div> ); }


Em nosso componente refatorado, dissemos explicitamente ao TypeScript para esperar um number para nosso estado count .


Esse detalhe evita bugs incômodos onde podemos acidentalmente acabar com uma string, objeto ou Deus me livre, null em vez do número esperado.


E lá vamos nós!


Refatoramos com sucesso nossos componentes React para usar TypeScript. Ao digitar explicitamente nossos componentes, estados e adereços, estamos criando uma base de código mais previsível e fácil de manter. Não estamos apenas codificando; estamos criando uma obra-prima com a precisão que ela merece.


A seguir, nos aprofundaremos em cenários mais complexos e como o TypeScript vem em nosso socorro!



API de gerenciamento de estado e contexto

Agora, vamos entrar nos detalhes do gerenciamento de estado no React with TypeScript. Se você usou a API Context em um projeto JavaScript, sabe que é um recurso poderoso para passar dados pela árvore de componentes sem precisar passar acessórios manualmente em todos os níveis. No TypeScript, obtemos o benefício adicional da digitação estrita, o que torna nossos dados de contexto ainda mais robustos e previsíveis.


Pronto para começar? Vamos!


1. Criando um Contexto Digitado

Primeiro, vamos criar um novo contexto com TypeScript. Este contexto garantirá que qualquer valor padrão, valor do provedor ou componente do consumidor corresponda ao nosso tipo esperado.


Veja como você definiria um contexto básico em JavaScript:

 // Before: DataContext.js import React, { createContext, useState } from 'react'; export const DataContext = createContext(); export const DataProvider = ({ children }) => { const [data, setData] = useState(null); return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


Agora, vamos digitar este contexto usando TypeScript:

 // After: DataContext.tsx import React, { createContext, useState, FC, ReactNode } from 'react'; // First, we define a type for our context's state interface DataContextState { data: any; // Tip: Replace 'any' with the expected type of 'data' setData: (data: any) => void; // And here too, replace 'any' with the actual expected type } // We ensure our createContext() call is typed with the above interface export const DataContext = createContext<DataContextState | undefined>(undefined); // Now, let's create a provider component export const DataProvider: FC<{children: ReactNode}> = ({ children }) => { const [data, setData] = useState<any>(null); // Again, consider replacing 'any' with your actual data type // The context provider now expects a value that matches 'DataContextState' return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


O que fizemos aqui foi criar uma interface TypeScript, DataContextState , que digita estritamente nossos dados de contexto. Também digitamos a função createContext e o componente DataProvider , garantindo que tudo, desde as variáveis de estado até os valores de contexto, esteja alinhado com nossos tipos definidos.


2. Usando o contexto digitado

Agora que digitamos nosso DataContext , vamos ver como podemos utilizá-lo em um componente.


Precisaremos usar o gancho useContext e veja como isso é feito:

 // ComponentUsingContext.tsx import React, { useContext, FC } from 'react'; import { DataContext } from './DataContext'; const ComponentUsingContext: FC = () => { // Here we're telling TypeScript to expect 'DataContextState' from our context const { data, setData } = useContext(DataContext) ?? {}; // This function would update the context state, triggering re-renders in consuming components const handleUpdateData = () => { const newData = { message: "Hello, TypeScript!" }; // This should match the structure of your data type setData(newData); }; return ( <div> <pre>{JSON.stringify(data, null, 2)}</pre> <button onClick={handleUpdateData}>Update Data</button> </div> ); };


Em ComponentUsingContext , estamos acessando o contexto e esperando que o TypeScript valide se o valor está alinhado com DataContextState . Nossa função handleUpdateData demonstra como você pode atualizar o estado compartilhado – quaisquer componentes que consumam DataContext seriam renderizados novamente com os novos dados quando setData fosse chamado.


Ao usar TypeScript com a API Context, ganhamos confiança de que nosso gerenciamento de estado compartilhado é consistente em todo o aplicativo. O compilador detecta quaisquer discrepâncias entre o que nosso contexto fornece e o que nossos componentes esperam. Essa sinergia torna nosso código mais confiável e nosso processo de desenvolvimento mais suave, permitindo-nos evitar categorias inteiras de bugs que poderíamos encontrar de outra forma.


Continue com o bom trabalho e lembre-se: um pouco de digitação agora economiza muita depuração mais tarde!



Teste de roteamento e operações assíncronas em TypeScript >

Agora que vimos como o TypeScript melhora vários aspectos da nossa aplicação React, é hora de falar sobre outra área crítica: testes.


Os testes são fundamentais para garantir que nosso aplicativo funcione conforme o esperado, e o TypeScript pode tornar nossos testes mais confiáveis e eficientes. Vamos ver como o TypeScript desempenha um papel nos testes, especialmente em um projeto React.


1. Preparando o cenário para testes

Antes de entrarmos no código, certifique-se de ter as bibliotecas necessárias instaladas para teste em um projeto React. Aqui está uma configuração rápida com Jest e React Testing Library, amplamente usados juntos para testar aplicativos React:

 npm install --save-dev jest @types/jest @testing-library/react @testing-library/jest-dom


Essas bibliotecas fornecem um ambiente robusto para escrever testes unitários e de integração. Agora, vamos considerar um cenário do mundo real para maior clareza.


2. Cenário de teste do mundo real: componente de saudação do usuário

Imagine que temos um componente simples em nosso aplicativo que cumprimenta os usuários com base na hora do dia. É um componente funcional que leva o nome do usuário como adereço e a hora atual como estado.


Esta é a aparência do nosso componente UserGreeting :

 // UserGreeting.tsx import React, { FC, useState, useEffect } from 'react'; interface UserGreetingProps { name: string; } const UserGreeting: FC<UserGreetingProps> = ({ name }) => { const [currentHour, setCurrentHour] = useState(new Date().getHours()); const [greeting, setGreeting] = useState(''); useEffect(() => { // Determine the time of day and set the appropriate greeting if (currentHour < 12) { setGreeting('Good morning'); } else if (currentHour < 18) { setGreeting('Good afternoon'); } else { setGreeting('Good evening'); } }, [currentHour]); return ( <div> <h1>{greeting}, {name}!</h1> </div> ); } export default UserGreeting;


Agora, precisamos escrever testes para garantir que nosso componente se comporte conforme esperado sob diferentes condições. Nossos casos de teste confirmarão se a saudação apropriada é exibida com base na hora do dia.


Veja como podemos escrever esses testes usando Jest e React Testing Library:

 // UserGreeting.test.tsx import React from 'react'; import { render, screen } from '@testing-library/react'; import UserGreeting from './UserGreeting'; describe('UserGreeting Component', () => { // Mock date for consistent testing const originalDate = Date; beforeAll(() => { const mockDate = new Date(2023, 10, 17, 14); // 2:00 PM global.Date = jest.fn(() => mockDate) as any; }); afterAll(() => { global.Date = originalDate; // Restore original Date object }); it('displays the correct greeting for the afternoon', () => { render(<UserGreeting name="Jordan" />); // Assert the greeting based on the mocked time of day expect(screen.getByText('Good afternoon, Jordan!')).toBeInTheDocument(); }); // Additional tests would repeat this process for other times of day, // ensuring our component behaves consistently. });


Neste script, estamos renderizando nosso componente com um horário definido (simulado como 14h) e verificando se ele gera "Boa tarde" conforme o esperado. Podemos escrever mais testes para outros horários do dia (manhã, noite) para garantir que nosso componente seja totalmente coberto.


Através do TypeScript, garantimos que os adereços que passamos para nossos componentes em nossos testes correspondam aos tipos esperados. Dessa forma, evitamos problemas com adereços incorretos que poderiam levar a falsos negativos em nossos testes, garantindo que nossos testes sejam robustos e confiáveis.


Usar TypeScript em testes ajuda a detectar problemas no início do processo de desenvolvimento, tornando nossos aplicativos mais robustos e fáceis de manter. É uma situação ganha-ganha! Lembre-se de que testes consistentes e abrangentes são uma marca registrada do desenvolvimento de software de alta qualidade. Mantem!




Tratamento de pacotes não TypeScript

Tudo bem, vamos abordar uma área que muitas vezes confunde as pessoas quando mudam para TypeScript em um projeto React: lidar com bibliotecas JavaScript e pacotes que não são escritos em TypeScript. É um cenário comum; você tem seu projeto TypeScript instalado e funcionando e, em seguida, instala um pacote de terceiros, apenas para descobrir que seu compilador TypeScript está reclamando. Não se preocupe; existem soluções.


1. Encontrando o problema

Aqui está um cenário típico: você está tentando usar um pacote que não tem suporte para TypeScript pronto para uso, e o compilador TypeScript começa a gerar erros como "Não foi possível encontrar um arquivo de declaração para o módulo 'nome do módulo'." Soa familiar?


Esse problema surge porque o TypeScript depende de definições de tipo para compreender a estrutura de bibliotecas e pacotes. Se essas definições de tipo estiverem faltando, o TypeScript ficará um pouco perdido. Mas não tema, temos estratégias para lidar com isso.

2. Usando DefinitelyTyped

Uma das primeiras coisas que você pode fazer é verificar se a comunidade forneceu definições de tipo para o pacote via DefinitelyTyped. DefinitelyTyped é um enorme repositório de definições de tipos mantido pela comunidade.


Veja como você verificaria e usaria os tipos do DefinitelyTyped:


  1. Procure definições de tipo para seu pacote tentando instalá-los usando npm. As definições de tipo em DefinitelyTyped geralmente são prefixadas com @types/ .
 npm install @types/package-name


Por exemplo, se você estivesse usando a biblioteca lodash , você executaria:

 npm install @types/lodash


  1. Após a instalação, você não precisa importar explicitamente os tipos em qualquer lugar do seu projeto. O TypeScript irá detectá-los e usá-los automaticamente, permitindo que você importe e use bibliotecas normalmente e obtenha preenchimento automático e verificação de tipo.


Mas e se não houver definição de tipo disponível no DefinitelyTyped?


3. Elaborando seu próprio arquivo de declaração

Se DefinitelyTyped não tiver as definições de tipo necessárias, é hora de criar um arquivo de declaração personalizado. Embora essa abordagem exija mais esforço, ela garante que seu projeto TypeScript funcione perfeitamente com a biblioteca JavaScript.


Aqui está uma versão simplificada do que você pode fazer:


  1. Crie um novo arquivo com extensão .d.ts no diretório source (ou types ) do seu projeto. Isso poderia ser algo como declarations.d.ts .


  2. Neste arquivo, você desejará declarar o módulo e potencialmente delinear a estrutura básica que você espera da biblioteca. Por exemplo:

 // This is a simplistic type declaration file for a hypothetical package. // We declare the module so TypeScript recognizes it. declare module 'name-of-untyped-package' { // Below, we're declaring a very basic structure. It's saying // there's a function we're expecting to exist, which returns any. // Ideally, you'd want to flesh this out with more specific types // if you know them or as you learn more about the library. export function functionName(arg: any): any; // You can continue to define the shapes of other functions or variables // you expect to exist within the package. The more detailed you are here, // the more helpful your type checking will be. }


Este arquivo de declaração caseiro não será tão abrangente quanto um conjunto completo de definições de tipo, mas diz ao TypeScript: "Confie em mim, eu sei que este módulo existe e fornece essas funções/variáveis." A partir daqui, você pode criar definições mais detalhadas conforme necessário.


Lembre-se de que lidar com pacotes que não sejam TypeScript pode ser um pouco complicado, mas essas estratégias garantem que seu projeto TypeScript permaneça robusto e desfrute da segurança de tipo e previsibilidade que buscamos. É tudo uma questão de confiança na sua base de código!



Melhores práticas e armadilhas comuns

Mudar para TypeScript em seu projeto React não envolve apenas alterar extensões de arquivo e adicionar anotações de tipo. Trata-se também de adaptar sua mentalidade e práticas de desenvolvimento para aproveitar ao máximo o que o TypeScript oferece, evitando obstáculos comuns. Então, vamos discutir algumas práticas recomendadas e armadilhas comuns que você pode encontrar durante esta jornada.

1. Melhores práticas

1.1 Apoie-se na inferência de tipo

Embora possa ser tentador anotar tudo, um dos pontos fortes do TypeScript é a inferência de tipos. Muitas vezes é desnecessário adicionar tipos explícitos a cada parte do seu código.

 // Instead of this: let x: number = 0; // You can rely on type inference: let x = 0; // TypeScript knows this is a number

A anotação excessiva pode tornar seu código detalhado sem agregar valor. Confie no TypeScript para inferir tipos onde for possível.

1.2 Abrace os tipos de utilitários

Os tipos de utilitário fornecem maneiras flexíveis de lidar com tipos em vários cenários. Eles podem economizar muito esforço e tornar o manuseio de tipos mais eficiente.

 // Example of using Partial to make all properties in an object optional function updateProfile(data: Partial<UserProfile>) { // function implementation } // Now you can pass only the parts of UserProfile you need to update updateProfile({ username: "newUserName" }); // This is valid

Partial , Readonly , Pick e outros tipos de utilitários podem ser incrivelmente úteis.

1.3 Use Enums para Conjuntos Conhecidos de Constantes

Quando você tem uma propriedade que só pode aceitar valores específicos, o uso enum pode deixar sua intenção clara e, ao mesmo tempo, fornecer validação para esses valores.

 enum UserRole { Admin = 'ADMIN', User = 'USER', Guest = 'GUEST', } // Now UserRole can only be one of the values defined in the enum function assignRole(role: UserRole) { // function implementation }

1.4 Preferir Interfaces para Definição de Estrutura de Objeto

Embora type e interface muitas vezes possam ser usados de forma intercambiável, o uso interface para definir a estrutura de objetos ou classes torna seu código mais legível e fornece melhores mensagens de erro.

 interface UserProfile { username: string; email: string; // More properties... }


2. Armadilhas Comuns

2.1 Uso excessivo any

Usar any nega os benefícios do TypeScript, ignorando a verificação de tipo. Embora possa parecer uma solução rápida, torna seu código menos seguro e previsível.

 // Try to avoid this: let userData: any = fetchData(); // Instead, define a type for the data you expect: let userData: UserProfile = fetchData();

2.2 Ignorando avisos do compilador

Os avisos do compilador do TypeScript existem para ajudá-lo. Ignorá-los pode levar aos mesmos tipos de bugs e problemas que você está tentando evitar usando o TypeScript.

2.3 Perdendo-se em tipos complexos

Às vezes, na tentativa de tornar os tipos precisos, os desenvolvedores criam definições de tipos incrivelmente complexas que são difíceis de entender e manter. Se seus tipos estão ficando complicados, talvez seja hora de simplificar ou refatorar seu código.

2.4 Esquecendo tipos de bibliotecas de terceiros

Se você estiver usando bibliotecas de terceiros, sempre verifique se existem tipos TypeScript existentes no DefinitelyTyped. Não fazer isso pode significar perder recursos de segurança de tipo para essas bibliotecas.

Concluindo, adotar TypeScript é mais do que apenas usar uma nova sintaxe; trata-se de adotar novas práticas que ajudem a evitar erros, tornar o código mais legível e melhorar a manutenção. Evite armadilhas comuns e lembre-se: o objetivo é escrever um código mais limpo, confiável e de fácil manutenção!




Conclusão

Bem, pessoal, chegamos ao fim de nossa jornada de migração do TypeScript. Foi uma viagem e tanto, não foi? Começamos com a grande questão de "por que" e nos aprofundamos nos detalhes de realmente mudar um projeto React de JavaScript para TypeScript. Desde a configuração do seu ambiente TypeScript até a refatoração de componentes, gerenciamento de estados, manipulação de rotas e até mesmo lidar com aqueles incômodos pacotes não-TypeScript, cobrimos muito terreno.


Refletindo sobre essa jornada, fica claro que migrar para TypeScript não é uma mera 'pesquisa e substituição' de arquivos .js por .tsx . É um movimento estratégico que envolve aprender novas convenções, compreender profundamente os tipos e, o mais importante, mudar a maneira como pensamos sobre a confiabilidade e consistência do nosso código.


Aqui estão algumas lições enquanto encerramos:

  1. Rede de segurança : TypeScript introduziu uma camada de segurança em nosso projeto, detectando erros antes que eles causem estragos em tempo de execução. Essa rede de segurança, depois que você se acostuma, muda o jogo em termos de confiança em seu código e velocidade geral de desenvolvimento.


  2. Comunicação mais clara : com tipos, nosso código agora se comunica de forma mais explícita. Seja você revisitando seu código ou um novo membro da equipe tentando entender as estruturas de seus componentes, o TypeScript serve como uma camada de documentação adicional.


  3. Confiança na refatoração : medo de refatorar? Bem, o TypeScript protege você. Com tipos garantindo contratos em seu código, muitos erros potenciais são detectados durante as fases de refatoração, tornando o processo menos assustador.


  4. Comunidade e ecossistema : adotar o TypeScript abre portas para um ecossistema próspero. Desde bibliotecas digitadas no DefinitelyTyped até suporte infinito em fóruns da comunidade e integração mais simplificada de pacotes de terceiros, você está em boa companhia.


  5. Curva de aprendizado : Sim, o TypeScript apresenta uma curva de aprendizado. Provavelmente houve momentos de frustração, confusões em torno de tipos e interfaces ou dificuldades com o compilador. Mas, reveja sua jornada e verá o quanto você entende melhor seu código e seu comportamento agora.


Lembre-se de que a transição para TypeScript não é um sprint; é uma maratona. Pode haver alguns obstáculos inicialmente, mas os ganhos de longo prazo em qualidade, previsibilidade e capacidade de manutenção do código valem o esforço.


À medida que você continua sua jornada de desenvolvimento, continue explorando, aprendendo e compartilhando suas experiências com TypeScript. Cada desafio é uma oportunidade de aprender. Seu futuro (e sua equipe) agradecerão pela base de código robusta, de tipo seguro e significativamente mais sustentável que você está cultivando hoje.


Obrigado por se juntar a mim nesta exploração do TypeScript com React. Continue codificando, melhorando e, o mais importante, aproveite o processo!


Permaneça conectado

Se você gostou deste artigo e deseja explorar mais sobre desenvolvimento web, sinta-se à vontade para se conectar comigo em várias plataformas:

dev.to

hackernoon.com

hashnode.com

twitter.com


Seus comentários e perguntas são sempre bem-vindos.

Continue aprendendo, codificando e criando aplicativos da web incríveis.


Boa codificação!



Recursos adicionais

Mesmo que nosso guia tenha chegado ao fim, sua aventura com TypeScript não para aqui. O mundo do TypeScript é vasto, com uma infinidade de recursos para explorar, aprender e contribuir. Abaixo estão alguns recursos valiosos que podem ajudar a reforçar sua compreensão e mantê-lo atualizado na comunidade TypeScript.


  1. Documentação oficial do TypeScript : Não há lugar melhor para explorar o TypeScript do que seu site oficial . Ele vem com documentação detalhada, exemplos e explicações sobre vários recursos.


  2. DefinitelyTyped : Ao trabalhar com bibliotecas de terceiros, DefinitelyTyped é um salva-vidas. É um enorme repositório de definições de tipo TypeScript de alta qualidade.


  3. Folha de dicas do React TypeScript : esta folha de dicas abrangente atende especificamente aos desenvolvedores do React em transição para o TypeScript, cobrindo padrões e práticas comuns.


  4. TypeScript Deep Dive : Um excelente livro online que oferece uma exploração detalhada do TypeScript. Deep Dive explica os detalhes do TypeScript com foco em cenários práticos.


  5. Repositório TypeScript GitHub : interaja com a comunidade e mantenha-se atualizado com os desenvolvimentos mais recentes em TypeScript visitando o repositório oficial TypeScript GitHub .


  6. Stack Overflow : A tag TypeScript no Stack Overflow é um centro de consultas comuns (e incomuns) e casos de uso diferenciados encontrados por desenvolvedores em todo o mundo. É uma mina de ouro de insights práticos.


  7. TypeScript Weekly : um boletim informativo com curadoria, TypeScript Weekly oferece os artigos, dicas e recursos mais recentes diretamente em sua caixa de entrada.


  8. Canais Reddit e Discord : comunidades em plataformas como r/typescript do Reddit e vários canais Discord hospedam discussões vibrantes, notícias e tópicos de solução de problemas relacionados ao TypeScript.


  9. Blog oficial do TypeScript : para anúncios, detalhes e tutoriais da equipe do TypeScript, confira o blog oficial .


  10. Plataformas de codificação online : experiências de aprendizagem interativas por meio de plataformas como Codecademy , freeCodeCamp e Scrimba oferecem cursos práticos de TypeScript.


Lembre-se de que as comunidades prosperam com a participação. Não hesite em fazer perguntas, contribuir com respostas ou compartilhar suas soluções e experiências. A sabedoria coletiva dos fóruns da comunidade, da documentação oficial e da prática contínua irá guiá-lo em direção ao domínio do TypeScript.


Boa codificação!