React 18 alpha tem foi lançado , o que é muito emocionante! Mas podemos usá-lo com TypeScript?

A resposta é “sim”, mas precisamos fazer algumas coisas para que isso aconteça. Esta postagem mostrará o que fazer.

Criação de um aplicativo React com TypeScript

Vamos criar um aplicativo React TypeScript vanilla com Criar aplicativo React :

 yarn create react-app my-app--template typescript 

Agora vamos atualizar a versão do React para @next :

 yarn add react @ next react-dom @ next 

Isso deixará você com entradas no package.json que usam React 18. Provavelmente será algo assim:

"react":"^ 18.0.0-alpha-e6be2d531", "react-dom":"^ 18.0.0-alpha-e6be2d531", 

Se executarmos yarn start , nos encontraremos executando um aplicativo React 18. Emocionante!

Usando as novas APIs

Então, vamos tentar usar a API ReactDOM.createRoot . É essa API que permite que nosso aplicativo use os novos recursos do React 18. Abriremos index.tsx e faremos esta alteração:

 -ReactDOM.render (
-
-
-,
-document.getElementById ('root')
-); 
 + const root=ReactDOM.createRoot (document.getElementById ('root'));
+
+ root.render (
+ 
+ 
+ 
+);  

Se estivéssemos executando JavaScript sozinho, isso funcionaria. Como também estamos usando o TypeScript, porém, agora nos deparamos com um erro:

A propriedade'createRoot'não existe no tipo'typeof import ("/code/my-app/node_modules/@ types/react-dom/index")'. TS2339

TypeScript lança um erro para a largura da propriedade createRoot

Este é o compilador TypeScript reclamando que não sabe nada sobre ReactDOM.createRoot . Isso ocorre porque as definições de tipo que estão atualmente em vigor em nosso aplicativo não têm essa API definida.

Vamos atualizar nossas definições de tipo:

 yarn add @ types/react @ types/react-dom 

Podemos razoavelmente esperar que tudo funcione agora-infelizmente, não funciona. O mesmo erro está apresentando. TypeScript não está feliz.

Contando ao TypeScript sobre as novas APIs

Se dermos uma olhada no PR que adicionou suporte para APIs , encontraremos algumas dicas. Se você olhar para next.d.ts , você encontrará essas informações, cortesia de Sebastian Silbermann :

/** * Esses são os tipos de coisas que estão presentes no próximo lançamento do React 18. * * Assim que o React 18 for lançado, eles podem ser movidos para o arquivo de índice principal. * * Para carregar os tipos declarados aqui em um projeto real, existem três maneiras. O mais fácil, * se o seu `tsconfig.json` já tem um array`"types"`na seção`"compilerOptions"`, * é adicionar `"react/next"` ao array `"types"`. * * Alternativamente, uma sintaxe de importação específica pode ser usada a partir de um arquivo typescript. * Este módulo não existe na realidade, por isso o {} é importante: * * `` `ts * importar {} de'react/next' * `` ` * * Também é possível incluí-lo por meio de uma referência de barra tripla: * * `` `ts */// * `` ` * * A importação ou a referência só precisa aparecer uma vez, em qualquer lugar do projeto. */

Vamos tentar o primeiro item da lista. Vamos editar nosso tsconfig.json e adicionar uma nova entrada à seção "compilerOptions":

"types": ["react/next","react-dom/next"] 

Se reiniciarmos nossa construção com yarn start , agora teremos um erro diferente:

Argumento do tipo'HTMLElement | null'não é atribuível ao parâmetro do tipo'Elemento | Documento | DocumentFragment | Comentário'.
O tipo'nulo'não pode ser atribuído ao tipo'Elemento | Documento | DocumentFragment | Comente'. TS2345

TypeScript lança um erro para o HTMLElement | null Digite

Agora, isso na verdade não tem nada a ver com os problemas com nossas novas definições de tipo React. Eles estão bem. Isso é TypeScript dizendo, “Não é garantido que document.getElementById ('root') retorne algo que não seja null . Como estamos no modo strictNullChecks , você precisa ter certeza de que root não é nulo. ”

Vamos lidar com isso testando se temos um elemento em jogo antes de invocar ReactDOM.createRoot :

 -const root=ReactDOM.createRoot (document.getElementById ('root')); 
 + const rootElement=document.getElementById ('root');
+ if (! rootElement) lança novo Error ('Falha ao encontrar o elemento raiz');
+ const root=ReactDOM.createRoot (rootElement);  

E com essa mudança feita, temos um aplicativo React 18 funcionando usando TypeScript. Aproveite!

A postagem Como usar o TypeScript com React 18 alpha apareceu primeiro no LogRocket Blog .