Published
- 4 min read
Setting up a dev environment to learn TypeScript
TypeScript is basically JavaScript with types. When writing your code you must define the types of your variables and optionally the returns of the functions. If you have been working with Java or C++ these concepts will feel very familiar.
However there is a small problem, TypeScript is not JavaScript - thus you need to use a compiler to convert your code into JavaScript.
This guide will take a look at how to set up a simple developer environment in order to play around with TypeScript.
Tools needed:
New Project
In order to create your first project you have to create a directory and initialize it with npm. You can use the Command Line and enter following:
mkdir learn-typescript
cd learn-typescript
npm init -y
code .
When VSCode is open you can open a Terminal using Ctrl-`
TypeScript
Initial Setup
npm install typescript
this will install the typescript compiler (tsc) to your project. You then could run commands like tsc index.ts
and it will compile it to index.js
. Which you could execute with node index.js
.
However you cannot directly debug your code and it is annoying to run the compile before execution.
Add TS-Node
TS-Node is a tool that allows you to directly execute TypeScript code. It uses the existing tsconfig.json
to process the code.
npm install ts-node
now you could run the code directly via a command like:
ts-node index.ts
Configure VSCode Debugging Tools
Ts-Node also allows you to use the VSCode debugging tools.
Press Ctrl-Shift-P
and enter “Debug: Open launch.json” (this will create a launch.json)
Select “Node.JS”
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch current file w/ ts-node",
"protocol": "inspector",
"args": ["${relativeFile}"],
"cwd": "${workspaceRoot}",
"runtimeArgs": ["-r", "ts-node/register"],
"internalConsoleOptions": "openOnSessionStart"
}
]
}
Now when you press F5
you can run and debug your typescript code. This also allows you to set breakpoints in VSCode.
Your first “Hello World”
Now create a new file called index.ts
and add following code:
async function greeter(name: string): Promise<void> {
await console.log(`Hello ${name}`)
}
greeter('World')
This “Hello World” takes advantages of Modern ES2017 Features “async/await” as well as adding types for TypeScript.
When you press F5
in VSCode this should result in an error as Promises are not available in ES5. We can fix this by configuring the compiler.
Configuring the compiler
In order to configure the compiler you need to run the command:
tsc --init
this will create a tsconfig.json
file. with this file you can configure the compiler. When creating it with the command it creates the file with the defaults and comments on what each compiler flag does.
One of the settings you should adjust is the “target” attribute. Currently it defaults to “es5” - this is because Internet Explorer 11 only supports ECMAScript 5.
We are targeting with our code NodeJS 10+, so we can change this value to “es2017”. As you can determine from this table
Running Hello World again
Now press F5
again the output should show you “Hello World”.
Conclusion
Now you are set to experiment some more with TypeScript.
One of the things you can experiment with is changing the target version of the compiler and running tsc index.ts
and take a look at the resulting JavaScript code. You will see that compiling to es5 or es6 the compiler adds a lot of extra code to enable functioning code, however when compiling to es2017 it (almost) only strips away the types and leaves the code practically identical.
Attachments
Compiling the code to ES5
To fix the code to compile to ES5 we first need core-js
a library that provides polyfills for older versions of JavaScript.
npm install core-js @types/core-js
now we must add the line index.ts:
import 'core-js/es6/promise'
async function greeter(name: string): Promise<void> {
await console.log(`Hello ${name}`)
}
greeter('World')
and in our tsconfig.json
:
we must add:
"lib": [
"es2015",
"dom"
],
Now your code should compile and run on IE11.