I started a react project using create-react-app few months ago and I'm interesting in migrating the project from Javascript to Typescript.
I saw that there is a way to create react app with typescript using the flag:
--scripts-version=react-scripts-ts
But I didn't find any explanation how can I migrate an existing JS project to TS. I need it to be done incrementally so I can work with both .js and .ts files so I can do the transformation over time. Does anyone has any experience with this migration? What are the required steps that should be done to make this work?
You will need to eject a configuration in order to do that.
After ejecting you need to perform the following steps:
tsx
andts
to theextensions
table in the webpack configs (dev and prod).Add ts-loader. Here is an example
Change eslint to tslint
Add source-map-loader to get a possibility to debug Typescript files.
Create a Typescript config file and remember to set
allowJs
to true.Create React App v2.1.0 was released today with TypeScript support today. That means you no longer need to eject or use the
react-scripts-ts
fork; all you need to do if you have an existing Create React App project is install the required packages:You can then simply rename
.js
files to.ts
files to start using TypeScript.(If you have an existing app using the create-react-app-typescript fork, here's a tutorial on how to port it to regular Create React App.)
I found a solution to migrate create-react-app from javascript to typescript, this way doesn't require eject.
create-react-app --scripts-version=react-scripts-ts
(Note - requirescreate-react-app
to be installed globally)package.json
file remove thereact-scripts
react-scripts-ts
to your project by running the commandyarn add react-scripts-ts
or if your are using npm thennpm install react-scripts-ts
. Or, add"react-scripts-ts": "2.8.0"
to package.json.tsconfig.json, tsconfig.test.json tslint.json
to your own projectpackage.json
, under scripts section, changereact-scripts
instances toreact-scripts-ts
(should be understart
,build
,test
andeject
@types/node
,@types/react
and@types/react-dom
. Put indevDependencies
section if using package.json.index.js
file name toindex.tsx
"allowSyntheticDefaultImports": true
- for more infoNOTE step 7 might require additional modification depends on what you have in your index.js file (if it depends on JS modules in the project).
Now you can run your project and it might work, for those of you who are getting error that contains
You may need an appropriate loader to handle this file type
regarding .js files, it happens because babel doesn't know how to load .js file from .tsx files. What we need to do is to change the project configuration. The way I found doing it without runningeject
is using react-app-rewired package. This package lets you configure external configuration which will be added/override the default project settings. What we'll do is using babel to load these type of files. Let's moved on:react-app-rewired
using yarn or npmpackage.json
is located) create a new file with the nameconfig-overrides.js
Put this code in
config-overrides
file:Edit package.json so the
start/start-js
,build
,test
, andeject
scripts use react-app-rewired as shown in the project readme. E.g."test": "react-app-rewired test --scripts-version react-scripts-ts --env=jsdom"
.Now you can start you the project and the problem should be solved. You might need additional modifications depending on your project (additional types and so).
Hope it helps
As suggested here in the comments, it's possible to define:
"compilerOptions": { "allowJs": true}
in your tsconfig.json file, so you can mix JS and TS without react-app-rewired. Thanks for mention this!UPDATE: create-react-app version 2.1.0 support typescript so for those of you who are starting from scratch you can use it to create new application with typescript, and according to the documentation it should be done with the following command:
For existing projects, after updating to version 2.1.0, add the following packages to your project's dependencies with the following command:
and then you can simply rename .js to .ts files.