Typescript: Functions

In this article, we are going learn about How you can use typescript in functions. And How to restrict the function to take different types of values than define parameters. It will be a basic introduction to functions as we go in-depth in this series you will learn so much more about functions such as How you can use Type Aliases or Interface to define custom types for Functions.
This is going to be a full series of typescript where you will learn from basic topics like string, boolean to more complex like Type Aliases, enums, Interface, generics, and etc.
Table of Contents
Functions
Writing function is a piece of cake when you know the JS but it gets a little bit complex in typescript. Don’t worry, we will take every aspect of that. We need to define the types of two things in function Parameters & Return Types.
Parameters
Function parameters are the names listed in the function’s definition. I’ll take an old example that I’ve mentioned before:
1 2 3 4 5 6 7 8 9 |
<span class="c1">// This is a norma JS Function that take two number and returns the sum </span> <span class="c1">// Problem is when you call the function you can pass any value </span> <span class="c1">// It won't show error because the variable does not have any kind of type</span> <span class="kd">function</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="nx">currentScore</span><span class="p">,</span> <span class="nx">increaseBy</span><span class="p">){</span> <span class="k">return</span> <span class="nx">currentScore</span> <span class="o">+</span> <span class="nx">increaseBy</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Now we define that both parameters have `number` type and it will only take the number</span> <span class="c1">// otherwise it will throw an error</span> <span class="kd">function</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="nx">currentScore</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="nx">increaseBy</span><span class="p">:</span> <span class="kr">number</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">currentScore</span> <span class="o">+</span> <span class="nx">increaseBy</span><span class="p">;</span> <span class="p">}</span> |
Following is an example of the error it will show when you pass the wrong value to the function:
1 2 3 4 5 |
<span class="kd">function</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="nx">currentScore</span><span class="p">:</span><span class="kr">number</span><span class="p">,</span> <span class="nx">increaseBy</span><span class="p">:</span><span class="kr">number</span><span class="p">){</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">currentScore</span> <span class="o">+</span> <span class="nx">increaseBy</span><span class="p">);</span> <span class="p">}</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1">// ✅ Correct</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="dl">"</span><span class="s2">2</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// ❌ Error</span> <span class="nx">increaseScore</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span> <span class="c1">// ❌ Error</span> |
Return Types
Return types matter. Because In typescript there are many return types. For example, you already know boolean
, number
and string
. But the question here is how we defined which type should return from the function. You can do that by the following syntax.
1 2 3 4 5 6 7 8 9 |
<span class="c1">// Syntax</span> <span class="kd">function</span> <span class="nx">funcName</span><span class="p">(</span><span class="nx">para</span><span class="p">:</span> <span class="nx">paraType</span><span class="p">):</span> <span class="nx">returnType</span> <span class="p">{</span> <span class="c1">//........</span> <span class="p">}</span> <span class="c1">// For Example:</span> <span class="kd">function</span> <span class="nx">greetings</span><span class="p">(</span><span class="nx">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">):</span> <span class="kr">string</span> <span class="p">{</span> <span class="k">return</span> <span class="dl">"</span><span class="s2">hello</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">name</span><span class="p">;</span> <span class="p">}</span> <span class="nx">greetings</span><span class="p">(</span><span class="dl">"</span><span class="s2">john</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// ✅</span> <span class="nx">greetings</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span> <span class="c1">// ❌ ERROR: Expected String</span> <span class="c1">// greet is 'string' type because greetings() return stirng type</span> <span class="kd">let</span> <span class="nx">greet</span> <span class="o">=</span> <span class="nx">greetings</span><span class="p">(</span><span class="dl">"</span><span class="s2">Don</span><span class="dl">"</span><span class="p">);</span> <span class="nx">greet</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// ❌ ERROR: because type is 'string'</span> |
Other Types
void
void
represents the return value of functions that don’t return a value. It’s the inferred type any time a function doesn’t have any return
statements or doesn’t return any explicit value from those return statements.
1 2 3 4 |
<span class="c1">// This function doesn't return anything thus its return type is void</span> <span class="kd">function</span> <span class="nx">sayHi</span><span class="p">(</span><span class="nx">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">):</span> <span class="k">void</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hi! </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">name</span><span class="p">);</span> <span class="p">}</span> |
never
The never
type represents values that are never observed. In a return type, this means that the function throws an exception or terminates the execution of the program.
1 2 3 |
<span class="kd">function</span> <span class="nx">handleError</span><span class="p">(</span><span class="nx">errMsg</span><span class="p">:</span> <span class="kr">string</span><span class="p">):</span> <span class="nx">never</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="nx">errMsg</span><span class="p">);</span> <span class="p">}</span> |
There are a lot more other types you can take a look at the documentation for further use.
Optional Parameters
When you define parameters, sometimes you don’t need to pass the parameters. So for that, you can add ?
next to the parameter as shown in the following code:
1 2 3 4 5 |
<span class="kd">function</span> <span class="nx">doSomething</span><span class="p">(</span><span class="nx">num</span><span class="p">?:</span> <span class="kr">number</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// ...</span> <span class="p">}</span> <span class="nx">doSomething</span><span class="p">();</span> <span class="c1">// ✅ OK</span> <span class="nx">doSomething</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span> <span class="c1">// ✅ OK</span> |
Working with Object
In typescript working with objects could make you feel a little weird. Why? You will know why at the end of this section. There are many instances where you can use objects. Let’s look at them one by one-
Passing Object as Parameter
Passing an object as a Parameter could be a little tricky. You need to define the types of each property you are passing as shown in the following code:
1 2 3 4 5 6 7 |
<span class="c1">// Destructuring an Object</span> <span class="kd">function</span> <span class="nx">signUp</span><span class="p">({</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">}:</span> <span class="p">{</span><span class="nl">email</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">password</span><span class="p">:</span> <span class="kr">string</span><span class="p">}):</span> <span class="k">void</span><span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">email</span><span class="p">);</span> <span class="p">}</span> <span class="c1">// You can also define the signUp function like the following</span> <span class="kd">function</span> <span class="nx">signUp</span><span class="p">(</span><span class="nx">user</span><span class="p">:</span> <span class="p">{</span><span class="nl">email</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">password</span><span class="p">:</span> <span class="kr">string</span><span class="p">}):</span> <span class="k">void</span><span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">email</span><span class="p">);</span> <span class="p">}</span> <span class="nx">signUp</span><span class="p">();</span> <span class="c1">// ❌ ERROR: need to pass an object</span> <span class="nx">signUp</span><span class="p">({});</span> <span class="c1">// ❌ ERROR: to pass an object with email & password ,</span> <span class="nx">signUp</span><span class="p">({</span><span class="na">email</span><span class="p">:</span> <span class="dl">"</span><span class="s2">[email protected]</span><span class="dl">"</span><span class="p">,</span> <span class="na">password</span><span class="p">:</span> <span class="dl">"</span><span class="s2">12345678</span><span class="dl">"</span><span class="p">});</span> <span class="c1">// ✅ Correct</span> |
Now, what if you want to pass an object with more than these two parameters:
1 2 3 4 5 6 7 8 |
<span class="kd">function</span> <span class="nx">signUp</span><span class="p">(</span><span class="nx">user</span><span class="p">:</span> <span class="p">{</span> <span class="nl">email</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">password</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}):</span> <span class="k">void</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">user</span><span class="p">);</span> <span class="p">}</span> <span class="c1">// Passing name in the signUp function</span> <span class="c1">// ❌ ERROR: 'name' does not exist</span> <span class="nx">signUp</span><span class="p">({</span> <span class="na">email</span><span class="p">:</span> <span class="dl">"</span><span class="s2">[email protected]</span><span class="dl">"</span><span class="p">,</span> <span class="na">password</span><span class="p">:</span> <span class="dl">"</span><span class="s2">12345678</span><span class="dl">"</span><span class="p">,</span> <span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Johnny</span><span class="dl">"</span> <span class="p">});</span> <span class="c1">// Creating a separate object and then passing it with the name</span> <span class="c1">// ✅ Correct and No Error, But if you use 'name' in the signUp function then you'll get an error</span> <span class="kd">let</span> <span class="nx">newUser</span> <span class="o">=</span> <span class="p">{</span> <span class="na">email</span><span class="p">:</span> <span class="dl">"</span><span class="s2">[email protected]</span><span class="dl">"</span><span class="p">,</span> <span class="na">password</span><span class="p">:</span> <span class="dl">"</span><span class="s2">12345678</span><span class="dl">"</span><span class="p">,</span> <span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Johnny</span><span class="dl">"</span> <span class="p">};</span> <span class="nx">signUp</span><span class="p">(</span><span class="nx">newUser</span><span class="p">);</span> |
Returning Object from Function
You can return an object through many ways from a function some of them are shown in the following code along with whether is it correct or not.
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="c1">// ❌ ERROR: A function whose declared type is neither 'void' nor 'any' must return a value</span> <span class="c1">// As function needs to return an object with name & age properties</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{</span><span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="kr">number</span><span class="p">}{}</span> <span class="c1">// ❌ ERROR: Property 'age' is missing</span> <span class="c1">// Function must have all the properties as specified (name, age)</span> <span class="c1">// And It only returns the name that's why it throws an error</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{</span><span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="kr">number</span><span class="p">}{</span> <span class="k">return</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">John</span><span class="dl">"</span><span class="p">};</span> <span class="p">}</span> <span class="c1">// ✅ CORRECT </span> <span class="c1">// No Error Because all the things are correct</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{</span><span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="kr">number</span><span class="p">}{</span> <span class="k">return</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">John</span><span class="dl">"</span><span class="p">,</span> <span class="na">age</span><span class="p">:</span> <span class="mi">29</span><span class="p">};</span> <span class="p">}</span> <span class="c1">// ❌ ERROR: 'lastName' does not exist </span> <span class="c1">// As function should return only 'name' and 'age'</span> <span class="c1">// And it returns 'lastName' too</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{</span><span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="kr">number</span><span class="p">}{</span> <span class="k">return</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">John</span><span class="dl">"</span><span class="p">,</span> <span class="na">age</span><span class="p">:</span> <span class="mi">29</span><span class="p">,</span> <span class="na">lastName</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Doe</span><span class="dl">"</span><span class="p">};</span> <span class="p">}</span> <span class="c1">// ✅ CORRECT </span> <span class="c1">// You can assign an object to some variable and then return it </span> <span class="c1">// Even if it has more properties as described</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{</span><span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="kr">number</span><span class="p">}{</span> <span class="kd">let</span> <span class="nx">user</span> <span class="o">=</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">John</span><span class="dl">"</span><span class="p">,</span> <span class="na">age</span><span class="p">:</span> <span class="mi">29</span><span class="p">,</span> <span class="na">lastName</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Doe</span><span class="dl">"</span><span class="p">}</span> <span class="k">return</span> <span class="nx">user</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// ❌ ERROR: A function whose declared type is neither 'void' nor 'any' must return a value</span> <span class="c1">// As you can see it has two {}</span> <span class="c1">// First {} shows that it should return an object</span> <span class="c1">// Second {} is function definition</span> <span class="c1">// It should return an object</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{}{}</span> <span class="c1">// ✅ CORRECT </span> <span class="c1">// It returns and object that's why it works, It can have any properties because we haven't specified</span> <span class="kd">function</span> <span class="nx">getInfo</span><span class="p">():{}{</span> <span class="k">return</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">John</span><span class="dl">"</span><span class="p">}</span> <span class="p">}</span> |
The above code example might be scary to look at but we can achieve these things with Type Aliases as well. We’ll look at it in the next article.
Wrapping up
In this article, I explained How you can use typescript in functions. And How to restrict the function to take different types of values than define parameters. It will be a basic introduction to functions as we go in-depth in this series you will learn so much more about functions such as How you can use Type Aliases or Interface to define custom types for Functions.
This is a series of Typescript that will help you to learn Typescript from the scratch. If you enjoyed this article, then don’t forget to give ❤️ and Bookmark 🏷️for later use and if you have any questions or feedback then don’t hesitate to drop them in the comments below. I’ll see in the next one.
Connect with me
Source: https://dev.to/j471n/typescript-functions-4nkp
