Today, I have another article about reactjs, today’s topic is with typescript. Great things and advantages while working with it.
I> Start:
1> About typescript:
It was developed by Microsoft, it is an open source programmer for developers. It’s a big deal, so it must be genuine and well received by many programmers.
The strengths from it:
- Inheriting the syntax from javascript makes it much easier to use than the similar source code
- In addition to inheriting from javascript versions, it also supports object-oriented syntax such as interfaces, classes, etc., so it is very powerful to apply design patterns.
- Recommended by lib / frameworks (because it is itself being gradually converted to writing in typescirpt)
- Large successful projects have also applied typescript
- Another thing is that it supports very well when using a tool that is visual code (microsoft goods) used by many ae frontend, suggest code support and extremely strong error when using typescirpt in this tool.
The following image shows the tools that support typescipt
2> Start installation:
To start working with Typescript Reactjs, we simply use the famous CRA (create-react-app) set:
If you use npm:
1 2 3 | npm install create-react-app create-react-app <name-project> template --typecript |
or if with yarn
1 2 3 | yarn add gloabl create-react-app yarn create react-app my-app --template typescript |
Or follow the instructions from this article: https://create-react-app.dev/docs/adding-typescript/
Result: The .js files are all written in typescript
If you use visual code (you probably use it all), it’s the visual code that says you’re using Typescript (supported by default, and very strong)
Next: start app:
1 2 | yarn start |
or
1 2 | npm start |
II> Learn about Reacjs, how to apply typescript:
1> How to create components:
- With function: The CRA will have 1 example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> logo <span class="token keyword">from</span> <span class="token string">'./logo.svg'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token string">'./App.css'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> App <span class="token punctuation">:</span> React <span class="token punctuation">.</span> <span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div className <span class="token operator">=</span> <span class="token string">"App"</span> <span class="token operator">></span> <span class="token operator"><</span> header className <span class="token operator">=</span> <span class="token string">"App-header"</span> <span class="token operator">></span> <span class="token operator"><</span> img src <span class="token operator">=</span> <span class="token punctuation">{</span> logo <span class="token punctuation">}</span> className <span class="token operator">=</span> <span class="token string">"App-logo"</span> alt <span class="token operator">=</span> <span class="token string">"logo"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> Edit <span class="token operator"><</span> code <span class="token operator">></span> src <span class="token operator">/</span> App <span class="token punctuation">.</span> tsx <span class="token operator"><</span> <span class="token operator">/</span> code <span class="token operator">></span> and save to reload <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> a className <span class="token operator">=</span> <span class="token string">"App-link"</span> href <span class="token operator">=</span> <span class="token string">"https://reactjs.org"</span> target <span class="token operator">=</span> <span class="token string">"_blank"</span> rel <span class="token operator">=</span> <span class="token string">"noopener noreferrer"</span> <span class="token operator">></span> Learn React <span class="token operator"><</span> <span class="token operator">/</span> a <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> header <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> App <span class="token punctuation">;</span> |
Through the above example, we see that in order to specify a reactjs component, we need to add: React.FC
after the component name to declare. To make it easy to learn, I will create an example of what makes the light bulb switch on and off. First, a component called SwitchButton.tsx
:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> SwitchButton <span class="token punctuation">:</span> React <span class="token punctuation">.</span> <span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> p <span class="token operator">></span> The light is <span class="token constant">ON</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> SwitchButton <span class="token punctuation">;</span> |
Now I try to remove the word React.Fc, it will immediately warn to declare more types for it Or delete the return → very detailed warning:
2> State:
a) introduction and analysis
A common problem when working with Reacjs, this time I will rewrite the SwitchButton component with the component class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">interface</span> <span class="token class-name">StateButton</span> <span class="token punctuation">{</span> stateLight <span class="token punctuation">:</span> boolean <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">PropsButton</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">class</span> <span class="token class-name">SwitchButton</span> <span class="token keyword">extends</span> <span class="token class-name">React <span class="token punctuation">.</span> Component</span> <span class="token operator"><</span> PropsButton <span class="token punctuation">,</span> StateButton <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> props <span class="token punctuation">:</span> PropsButton <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span> <span class="token punctuation">(</span> props <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token operator">=</span> <span class="token punctuation">{</span> stateLight <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">render</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> p <span class="token operator">></span> The light is <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token punctuation">.</span> stateLight <span class="token operator">?</span> <span class="token string">"ON"</span> <span class="token punctuation">:</span> <span class="token string">"OFF"</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- At this point, I will create it an interface named StateButton, here I can declare it the possible states in the component, here I create a state called stateLight type of boolean state indicating on / off state. switches.
- Then you pay attention in the component creation section:
1 2 | export default class SwitchButton extends React.Component <PropsButton,StateButton> |
(you do not care PropsButton, here I created before i)
b) error cases:
So I can use as usual already, assuming in the constructor I set state it is different from the boolen, what happens?
Oh, it reported a detailed error that stateLight can only be boolean, not numbered! Great, excellent, wonderfull
Suppose I added a new state called name without declaring any state in the interface:
Instant error, quite tight! Avoid messy declarations!
Through the above example, we can see that the construction of reactjs with typescript is very tight and professional! Very good support for programmers to warn them, and alert very quickly! Suggest code speed is also faster (maybe microsoft goods should match quickly, very good) !!
3> Props:
a) introduction and analysis
Usually we use propstype or flow-js, but with typecript we do not need to import and the support is very good.
(It is also recommended by Facebook to move into typescript that flowjs or other packages should be used)
- First, I changed the management state to turn the light on and off → props:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">interface</span> <span class="token class-name">PropsButton</span> <span class="token punctuation">{</span> stateLight <span class="token punctuation">:</span> boolean <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">class</span> <span class="token class-name">SwitchButton</span> <span class="token keyword">extends</span> <span class="token class-name">React <span class="token punctuation">.</span> Component</span> <span class="token operator"><</span> PropsButton <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">render</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> p <span class="token operator">></span> The light is <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> props <span class="token punctuation">.</span> stateLight <span class="token operator">?</span> <span class="token string">"ON"</span> <span class="token punctuation">:</span> <span class="token string">"OFF"</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Similar to state, we also create interfaces to declare types for props
- This time I will create another parent component named House → will call this ButtonSwitch component:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> SwitchButton <span class="token keyword">from</span> <span class="token string">'./SwitchButton'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> House <span class="token punctuation">:</span> React <span class="token punctuation">.</span> <span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> SwitchButton stateLight <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> House <span class="token punctuation">;</span> |
b) error cases:
At this Component House when I call SwitchButton:
- The props stateLight passed another type of boolean
- Transmission missing props:
- Excessive transmission cases also report errors:
III> Conclusion:
- Typescript works well with reactjs, making reactjs tighter! It also supports programmers and is very well compatible with editors.
- In addition to the above applications, it also supports refs, events, … in reacjts! See you later!
IV> Reference:
- Install with create-react-app: https://create-react-app.dev/docs/adding-typescript/
- Typescript homepage: https://create-react-app.dev/docs/adding-typescript/