Skip to content
This repository was archived by the owner on Nov 16, 2023. It is now read-only.

Commit c7913f0

Browse files
📝 Readme small updates and fixes
- block codes - white space unification - headers are now grouped by level - minor typos
1 parent 4515e2f commit c7913f0

File tree

1 file changed

+38
-34
lines changed

1 file changed

+38
-34
lines changed

README.md

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,24 @@ This walkthrough illustrates how to adopt TypeScript in an existing React/Babel/
44

55
If you are starting a new React project instead of converting one, you can use [this tutorial](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/tutorials/React.md).
66

7-
Adopting TypeScript in any project can be broken down into 2 phases,
8-
* Adding TypeScript compiler (tsc) to your build pipeline.
9-
* Converting JavaScript files into TypeScript files.
7+
Adopting TypeScript in any project can be broken down into 2 phases:
108

11-
# Understand the existing JavaScript project
9+
* Adding TypeScript compiler (tsc) to your build pipeline.
10+
* Converting JavaScript files into TypeScript files.
11+
12+
## Understand the existing JavaScript project
1213

1314
Before we dive into TypeScript adoption, let's take a look at the structure of the TicTacToe app. It contains a few components and looks like below with or without TypeScript.
1415

16+
```html
1517
<p align="center">
1618
<img src ="image/components.png"/>
1719
</p>
20+
```
1821

1922
As shown in `package.json`, the app already includes React/ReactDOM, Webpack as bundler & task runner, and [babel-loader](https://github.com/babel/babel-loader) Webpack plugin to use Babel for ES6 and JSX transpilation. The project has the below overall layout before we adopt TypeScript:
2023

21-
```
24+
```txt
2225
TicTacToe_JS /
2326
|---- css/ // css style sheets
2427
|---- src/ // source files
@@ -29,49 +32,50 @@ TicTacToe_JS /
2932
|---- restartBtn.jsx // RestartBtn React component
3033
|---- .babelrc // a list of babel presets
3134
|---- index.html // web page for our app
32-
|---- package.json // node package configuration file
35+
|---- package.json // node package configuration file
3336
|---- webpack.config.js // Webpack configuration file
3437
```
3538

36-
# Add TypeScript compiler to build pipeline
39+
## Add TypeScript compiler to build pipeline
3740

38-
## Install dependencies
41+
### Install dependencies
3942

4043
First off, open terminal and `cd` to the `TicTacToe_JS` folder. Install dependencies in `package.json`.
4144

42-
```
45+
```js
4346
cd TicTacToe_JS
4447
npm install
4548
```
4649

4750
Additionally, install TypeScript (2.3 or higher), [awesome-typescript-loader](https://www.npmjs.com/package/awesome-typescript-loader) and [source-map-loader](https://www.npmjs.com/package/source-map-loader) as dev dependencies if you haven't. awesome-typescript-loader is a Webpack plugin that helps you compile TypeScript code to JavaScript, much like babel-loader for Babel. There are also other alternative loaders for TypeScript, such as [ts-loader](https://github.com/TypeStrong/ts-loader). source-map-loader adds source map support for debugging.
4851

49-
```
52+
```sh
5053
npm install --save-dev typescript awesome-typescript-loader source-map-loader
5154
```
5255

53-
Get the type declaration files (.d.ts files) from [@types](https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/) for any library in use. For this project, we have React and ReactDOM.
56+
Get the type declaration files (.d.ts files) from [@types](https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/) for any library in use. For this project, we have React and ReactDOM.
5457

55-
```
58+
```sh
5659
npm install --save @types/react @types/react-dom
5760
```
5861

5962
If you are using an older version of React/ReacDOM that are incompatible with the latest .d.ts files from @types, you can specify version number for `@types/react` and `@types/react-dom` in `package.json`.
6063

61-
## Configure TypeScript
64+
### Configure TypeScript
6265

63-
Next, configure TypeScript by creating a `tsconfig.json` file in the `TicTacToe_JS` folder, and add,
66+
Next, configure TypeScript by creating a `tsconfig.json` file in the `TicTacToe_JS` folder, and add,
6467

65-
```
68+
```json
6669
{
6770
"compilerOptions": {
6871
"outDir": "./dist/", // path to output directory
6972
"sourceMap": true, // allow sourcemap support
7073
"strictNullChecks": true, // enable strict null checks as a best practice
71-
"module": "es6", // specifiy module code generation
74+
"module": "es6", // specify module code generation
7275
"jsx": "react", // use typescript to transpile jsx to js
7376
"target": "es5", // specify ECMAScript target version
74-
"allowJs": true // allow a partial TypeScript and JavaScript codebase
77+
"allowJs": true // allow a partial TypeScript and JavaScript codebase
78+
7579
},
7680
"include": [
7781
"./src/"
@@ -81,14 +85,14 @@ Next, configure TypeScript by creating a `tsconfig.json` file in the `TicTacToe_
8185

8286
You can edit some of the options or add more based on your own need. See more full [compiler options](https://www.typescriptlang.org/docs/handbook/compiler-options.html).
8387

84-
## Set up build pipeline
88+
### Set up build pipeline
8589

86-
To add TypeScript compilation as part of our build process, you need to modify the Webpack config file `webpack.configure.js`. This section is specific to Webpack. However, if you are using a different task runner (e.g. Gulp) for your React/Babel project, the idea is the same - replace the Babel build step with TypeScript, as TypeScript also offers transpiling to lower ECMAScript versions and JSX transpilation with a shorter build time in most cases. If you wish, you can also keep Babel by adding a TypeScript build step before Babel and feeding its output to Babel.
90+
To add TypeScript compilation as part of our build process, you need to modify the Webpack config file `webpack.configure.js`. This section is specific to Webpack. However, if you are using a different task runner (e.g. Gulp) for your React/Babel project, the idea is the same - replace the Babel build step with TypeScript, as TypeScript also offers transpiling to lower ECMAScript versions and JSX transpilation with a shorter build time in most cases. If you wish, you can also keep Babel by adding a TypeScript build step before Babel and feeding its output to Babel.
8791

8892
Generally, we need to change `webpack.config.js` in a few ways,
8993

9094
1. Expand the module resolution extensions to include `.ts` and `.tsx` files.
91-
2. Replace `babel-loader` with `awesome-typescript-loader`.
95+
2. Replace `babel-loader` with `awesome-typescript-loader`.
9296
3. Add source-map support.
9397

9498
Let's modify `webpack.configure.js` as below,
@@ -108,7 +112,7 @@ module.exports = {
108112
rules: [
109113
// changed from { test: /\.jsx?$/, use: { loader: 'babel-loader' } },
110114
{ test: /\.(t|j)sx?$/, use: { loader: 'awesome-typescript-loader' } },
111-
// addition - add source-map support
115+
// addition - add source-map support
112116
{ enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
113117
]
114118
},
@@ -127,11 +131,11 @@ Note that if you plan to adopt TypeScript in the entry file, you should change `
127131

128132
You now have the build pipeline correctly set up with TypeScript handling the transpilation. Try bundling the app with the following command and then open `index.html` in a browser,
129133

130-
```
131-
node ./node_modules/webpack/bin/webpack.js
134+
```sh
135+
node ./node_modules/.bin/webpack
132136
```
133137

134-
# Transition from JS(X) to TS(X)
138+
## Transition from JS(X) to TS(X)
135139

136140
In this part, we will walk through the following steps progressively,
137141

@@ -141,7 +145,7 @@ In this part, we will walk through the following steps progressively,
141145

142146
While you get the most out of TypeScript by fully adopting it across your codebase, understanding each of the three steps comes in handy as you decide what to do in case you have certain part of your JavaScript codebase you want to leave as-is (think legacy code that no one understands).
143147

144-
## Minimum transition steps
148+
### Minimum transition steps
145149

146150
Let's look at `gameStateBar.jsx` as an example.
147151

@@ -153,21 +157,21 @@ On line 3 `export class GameStateBar extends React.Component {`, change the clas
153157

154158
By now, awesome-typescript-loader should be able to successfully compile this TypeScript component to JavaScript. Again, try bundling the app with the following command and then open `index.html` in a browser,
155159

156-
```
160+
```sh
157161
node ./node_modules/webpack/bin/webpack.js
158162
```
159163

160-
## Add types
164+
### Add types
161165

162166
The more type information provided to TypeScript, the more powerful its type checking is. As a best practice, we recommend providing types for all declarations. We will again use the `gameStateBar` component as an example.
163167

164-
For any `React.Component`, we should properly define the types of the property and state object. The `gameStateBar` component has no properties, therefore we can use `{}` as type.
168+
For any `React.Component`, we should properly define the types of the property and state object. The `gameStateBar` component has no properties, therefore we can use `{}` as type.
165169

166170
The state object contains only one property `gameState` which shows the game status (either nothing, someone wins, or draw). Given `gameState` can only have certain known string literal values, let's use [string literal type](https://www.typescriptlang.org/docs/handbook/advanced-types.html) and define the interface as follow before the class declaration.
167171

168172
```ts
169173
interface GameStateBarState {
170-
gameState: "" | "X Wins!" | "O Wins!" | "Draw";
174+
gameState: "" | "X Wins!" | "O Wins!" | "Draw";
171175
}
172176
```
173177

@@ -209,19 +213,19 @@ private handleRestart(e: Event) {...}
209213

210214
Again, try bundling the app with the following command and then open `index.html` in a browser,
211215

212-
```
213-
node ./node_modules/webpack/bin/webpack.js
216+
```sh
217+
node ./node_modules/.bin/webpack
214218
```
215219

216-
## Adopt TypeScript in the entire codebase
220+
### Adopt TypeScript in the entire codebase
217221

218222
Adopting TypeScript in the entire codebase is more or less repeating the previous two steps for all js(x) files. You may need to make changes additional to what is mentioned above while converting perfectly valid JavaScript to TypeScript. However the TypeScript compiler and your editor (if it has TypeScript support) should give you useful tips and error messages. For instance, parameters can be optional in JavaScript, but in TypeScript all [optional parameter](https://www.typescriptlang.org/docs/handbook/functions.html) must be marked with `?`
219223

220224
You can see the fully converted TicTacToe project in the `TicTacToe_TS` folder. Build the app with,
221225

222-
```
226+
```sh
223227
npm install
224-
node ./node_modules/webpack/bin/webpack.js
228+
node ./node_modules/.bin/webpack
225229
```
226230

227231
Run the app by opening `index.html`.

0 commit comments

Comments
 (0)