Hello everyone, today I would like to share the great features of TypeScript (TS), let’s find out!
Talking about TypeScript is now very popular, many projects like React have applied TypeScript (TS) instead of Javascript (JS) as usual and many newcomers (like me) are very frustrating. and annoying when the code is tired, but I have to go fix some errors of TS, it takes time. But when I entered the React project, I had to write TS, I couldn’t help but write so I had to go find out what TS is? Then only practice on coding, but gradually TS is very effective.
In addition to setting the Type for a variable, parameter or function , for example, when you look at a function’s parameter you will realize what type of value the params you receive, so it’s easy for me to handle … yes … .
Then say crap for many hours on the main topic! This article you have never learned about TS can be easy to understand, but after watching, let’s practice a lot.
1. Unions
Unions is one of the very easy to understand features in TS, it is like the “||” operator In JS, it is possible to set multiple types
For example:
1 2 3 4 | <span class="token keyword">function</span> <span class="token function">myFn</span> <span class="token punctuation">(</span> <span class="token parameter">id <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">|</span> <span class="token builtin">number</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token builtin">console</span> <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'id'</span> <span class="token punctuation">,</span> id <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Explanation : Looking at the above, you can see that the parameter id can accept two types of values: string or number
Unions are also useful when denoting the type as nullable :
1 2 3 4 5 6 7 8 | <span class="token keyword">function</span> <span class="token function">myFn</span> <span class="token punctuation">(</span> <span class="token parameter">id <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">|</span> <span class="token keyword">undefined</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> id <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token builtin">console</span> <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> <span class="token string">'no identifier found'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token builtin">console</span> <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'id'</span> <span class="token punctuation">,</span> id <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Explanation : In the above code, you can realize that id can only have 2 values: string or undefined , this makes it easier for you to process the code inside because we already know its output type . .
Similarly, you can also apply Unions to the interface :
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 28 29 30 | <span class="token keyword">enum</span> Vehicles <span class="token punctuation">{</span> bike <span class="token punctuation">,</span> plane <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">Vehicle</span> <span class="token punctuation">{</span> speed <span class="token operator">:</span> <span class="token builtin">number</span> <span class="token punctuation">;</span> <span class="token keyword">type</span> <span class="token operator">:</span> Vehicles <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">Bike</span> <span class="token keyword">extends</span> <span class="token class-name">Vehicle</span> <span class="token punctuation">{</span> <span class="token function-variable function">ride</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">void</span> <span class="token punctuation">;</span> <span class="token keyword">type</span> <span class="token operator">:</span> Vehicles <span class="token punctuation">.</span> bike <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">Plane</span> <span class="token keyword">extends</span> <span class="token class-name">Vehicle</span> <span class="token punctuation">{</span> <span class="token function-variable function">fly</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">void</span> <span class="token punctuation">;</span> <span class="token keyword">type</span> <span class="token operator">:</span> Vehicles <span class="token punctuation">.</span> plane <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">useVehicle</span> <span class="token punctuation">(</span> <span class="token parameter">vehicle <span class="token operator">:</span> Bike <span class="token operator">|</span> Plane</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> vehicle <span class="token punctuation">.</span> <span class="token keyword">type</span> <span class="token operator">===</span> Vehicles <span class="token punctuation">.</span> bike <span class="token punctuation">)</span> <span class="token punctuation">{</span> vehicle <span class="token punctuation">.</span> <span class="token function">ride</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> vehicle <span class="token punctuation">.</span> <span class="token keyword">type</span> <span class="token operator">===</span> Vehicles <span class="token punctuation">.</span> plane <span class="token punctuation">)</span> <span class="token punctuation">{</span> vehicle <span class="token punctuation">.</span> <span class="token function">fly</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
2. Generics
As you can see in Unions you can set mutile types but that’s not a good idea when you want to set multiple types and use it for multiple variables, which is quite clumsy like that.
1 2 3 4 | <span class="token keyword">function</span> <span class="token function">myFn</span> <span class="token punctuation">(</span> <span class="token parameter">id <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">|</span> <span class="token builtin">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> name <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">|</span> <span class="token builtin">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> address <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">|</span> <span class="token builtin">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> |
Pretty wordy, isn’t it, then let’s use Generics to see how!
1 2 3 4 | <span class="token keyword">function</span> myFn <span class="token operator"><</span> <span class="token constant">T</span> <span class="token keyword">extends</span> <span class="token class-name">string</span> <span class="token operator">|</span> <span class="token builtin">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">></span> <span class="token punctuation">(</span> id <span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">,</span> name <span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">,</span> address <span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> |
So now you can use it easily, when to this guy <T extends string | string [] seems confusing, actually, it’s easy to understand, you just understand that this guy T is just a string or an array in which the elements are only strings .
3. Tuples
When it comes to Tuples , there are two things to say: Explicitly and Implicitly
Explicitly : Meaning that the variable guy array mi can only be an array and only 2 elements, the first element is a string , the second is number
1 2 | <span class="token keyword">const</span> array <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">,</span> <span class="token builtin">number</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'test'</span> <span class="token punctuation">,</span> <span class="token number">12</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> |
Implicitly : The array you are just read-only can not be edited, deleted anything
1 2 | <span class="token keyword">const</span> array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'test'</span> <span class="token punctuation">,</span> <span class="token number">12</span> <span class="token punctuation">]</span> <span class="token keyword">as</span> <span class="token keyword">const</span> <span class="token punctuation">;</span> |
Alternatively you can apply to the function :
1 2 3 4 | <span class="token keyword">function</span> <span class="token function">foo</span> <span class="token punctuation">(</span> <span class="token parameter">x <span class="token operator">:</span> <span class="token punctuation">[</span> startIndex <span class="token operator">:</span> <span class="token builtin">number</span> <span class="token punctuation">,</span> endIndex <span class="token operator">:</span> <span class="token builtin">number</span> <span class="token punctuation">]</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> |
In a nutshell, Tuples function either to limit the lengh of an array or to set it to read-only .
4. Mapped Types
Mapped Types said:
Sometimes you need to look at other people’s happiness to find your own happiness
This means that a variable can use a different type or interface type for itself.
For example:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">interface</span> <span class="token class-name">Teacher</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">;</span> email <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> ReadonlyTeacher <span class="token operator">=</span> Readonly <span class="token operator"><</span> Teacher <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token keyword">const</span> t <span class="token operator">:</span> ReadonlyTeacher <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> <span class="token string">'jose'</span> <span class="token punctuation">,</span> email <span class="token operator">:</span> <span class="token string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> '</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> t <span class="token punctuation">.</span> name <span class="token operator">=</span> <span class="token string">'max'</span> <span class="token punctuation">;</span> <span class="token comment">// Error: Cannot assign to 'name' because it is a read-only property.(2540)</span> |
In addition, there are many other utility types : Omit, Partial, Readonly, Readonly, Exclude, Extract, NonNullable, ReturnType.
You can combine with Generics :
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">interface</span> <span class="token class-name">Teacher</span> <span class="token punctuation">{</span> <span class="token keyword">readonly</span> name <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">;</span> <span class="token keyword">readonly</span> email <span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Writeable <span class="token operator"><</span> <span class="token constant">T</span> <span class="token operator">></span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">-</span> <span class="token keyword">readonly</span> <span class="token punctuation">[</span> <span class="token constant">P</span> <span class="token keyword">in</span> <span class="token keyword">keyof</span> <span class="token constant">T</span> <span class="token punctuation">]</span> <span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">[</span> <span class="token constant">P</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> t <span class="token operator">:</span> Writeable <span class="token operator"><</span> Teacher <span class="token operator">></span> <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> <span class="token string">'jose'</span> <span class="token punctuation">,</span> email <span class="token operator">:</span> <span class="token string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> '</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> t <span class="token punctuation">.</span> name <span class="token operator">=</span> <span class="token string">'max'</span> <span class="token punctuation">;</span> <span class="token comment">// works fine</span> |
Explanation : Writeable uses the type of Teacher (name, email is readonly), you can see -readonly means to remove readonly so we can change the name attribute.
summary
In summary above are the great features of TypeScript hope the article will help you in the process of your work, see you in other articles. Thanks