DEV Community

Cover image for The Newbie's Guide to TypeScript: Important TypeScript Concepts for Beginners
Tunde Fadipe
Tunde Fadipe

Posted on

The Newbie's Guide to TypeScript: Important TypeScript Concepts for Beginners

Whether you're a newcomer to programming or an experienced JavaScript developer eager to explore TypeScript, this in-depth guide is tailored to help you grasp fundamental concepts and embark on your TypeScript journey. With a focus on clarity, I will present key concepts alongside code examples and explanations to ensure a thorough comprehension. While this article may be lengthy, it guarantees comprehensive coverage in a concise and reader-friendly manner.

Today, TypeScript has gained immense popularity in the world of web development, thanks to its ability to add static typing to JavaScript. TypeScript is a superset of JavaScript, meaning that all valid JavaScript code is also valid TypeScript code. However, TypeScript adds a number of features that make it easier to write and maintain large JavaScript codebases.
I'll walk you through the following essential TypeScript fundamentals, offering code examples to facilitate your comprehension:

  1. What is TypeScript?
  2. Setting Up Your Development Environment
  3. Basic Types
  4. Interfaces
  5. Classes
  6. Functions
  7. Modules
  8. Generics
  9. Enums

A. What is TypeScript?

TypeScript is an open-source programming language developed and maintained by Microsoft. It is a statically typed superset of JavaScript, which means that it extends JavaScript by adding static typing to the language. Static typing allows developers to specify the types of variables, function parameters, and return values in their code, which can help catch type-related errors at compile-time rather than runtime. This results in more reliable and maintainable code, making TypeScript an excellent choice for large-scale applications.

B. Setting Up Your Development Environment.

Before you start writing TypeScript, you'll need to set up your development environment. Here's a step-by-step guide:

Installation
Install Node.js and NPM (Node Package Manager) if you haven't already. Then, use NPM to install TypeScript globally:

npm install -g typescript

Enter fullscreen mode Exit fullscreen mode

Creating a TypeScript Project
Create a new directory for your project and initialize it with npm:

mkdir my-ts-project
cd my-ts-project
npm init -y

Enter fullscreen mode Exit fullscreen mode

Next, create a TypeScript configuration file (tsconfig.json) using the following command:

tsc --init

Enter fullscreen mode Exit fullscreen mode

This file allows you to configure TypeScript for your project.

C. Basic TypeScript Types

TypeScript provides several basic types that you can use to annotate variables and function parameters. These types help you specify the expected data type of a value, and TypeScript's type checker will enforce type correctness. Here are some of the basic TypeScript types and their usage with code examples:

number:
Represents numeric values, both integers and floating-point numbers.

let age: number = 30;
let price: number = 19.99;

// TypeScript will flag a type error if you try to assign a non-number value
// to a variable declared as a number.
// age = "thirty"; // Error: Type '"thirty"' is not assignable to type 'number'.

Enter fullscreen mode Exit fullscreen mode

string:
Represents textual data enclosed in single or double quotes.

let name: string = "John";
let greeting: string = 'Hello, TypeScript!';

// TypeScript will flag a type error if you try to assign a non-string value
// to a variable declared as a string.
// name = 42; // Error: Type '42' is not assignable to type 'string'.

Enter fullscreen mode Exit fullscreen mode

boolean:
Represents a binary value, either true or false.

let isCompleted: boolean = true;
let hasError: boolean = false;

// TypeScript will flag a type error if you try to assign a non-boolean value
// to a variable declared as a boolean.
// isCompleted = 1; // Error: Type '1' is not assignable to type 'boolean'.

Enter fullscreen mode Exit fullscreen mode

array:
Represents an array of values of a specific type.

let numbers: number[] = [1, 2, 3];
let fruits: string[] = ["apple", "banana", "cherry"];

// TypeScript ensures that array elements are of the specified type.
// numbers.push("four"); // Error: Argument of type '"four"' is not assignable to parameter of type 'number'.

Enter fullscreen mode Exit fullscreen mode

tuple:
Represents an array with a fixed number of elements where each element may have a different type.

let person: [string, number] = ["John", 30];

// TypeScript enforces the order and type of elements in a tuple.
// person = [30, "John"]; // Error: Type 'number' is not assignable to type 'string'.

Enter fullscreen mode Exit fullscreen mode

null and undefined:
Represent values that signify the absence of a value.

let nullableValue: null = null;
let undefinedValue: undefined = undefined;

// These types are useful when working with options that may not always have a value.

Enter fullscreen mode Exit fullscreen mode

any:
Represents a value of any type, effectively opting out of TypeScript's static type checking. Use this sparingly, as it undermines the benefits of TypeScript.

let dynamicValue: any = "Hello, TypeScript!";
dynamicValue = 42; // No type error because 'any' allows any type.

Enter fullscreen mode Exit fullscreen mode

void:
Represents the absence of a return value in a function.

function logMessage(message: string): void {
  console.log(message);
}

// Functions with 'void' can only be used for their side effects.

Enter fullscreen mode Exit fullscreen mode

These are some of the basic TypeScript types you can use in your code. By annotating your variables and function parameters with these types, you can catch type-related errors at compile-time and make your code more robust and maintainable.

D. Interfaces

In TypeScript, an interface is a way to define a contract or a structure for objects. It specifies the properties and their types that an object must have to adhere to that contract. Here's how you can use interfaces in TypeScript.

Declaring an Interface:
You declare an interface using the interface keyword, followed by the name of the interface and a set of property declarations inside curly braces.

interface Person {
  name: string;
  age: number;
}

Enter fullscreen mode Exit fullscreen mode

In this example, we've declared an interface named Person, which defines that an object adhering to this interface must have a name property of type string and an age property of type number.

Implementing an Interface:
To create an object that adheres to an interface, you use the implements keyword.

class Student implements Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

Enter fullscreen mode Exit fullscreen mode

Using Interfaces:
You can use interfaces to specify the shape of function parameters and return types as well.

function greet(person: Person): string {
  return `Hello, ${person.name}! You are ${person.age} years old.`;
}

const student = new Student("Alice", 25);
console.log(greet(student)); // Output: Hello, Alice! You are 25 years old.

Enter fullscreen mode Exit fullscreen mode

Here, the greet function expects a parameter that adheres to the Person interface. This enforces that any object passed to greet must have the name and age properties.

Optional Properties:
You can make interface properties optional by adding a ? after their names.

interface Car {
  make: string;
  model: string;
  year?: number; // 'year' is optional
}

const myCar: Car = {
  make: "Toyota",
  model: "Camry",
  // year: 2022 // 'year' is optional, so it's okay to omit it.
};

Enter fullscreen mode Exit fullscreen mode

E. Classes

In TypeScript, a class is a blueprint for creating objects that share a common structure and behavior. Classes encapsulate data (properties) and methods (functions) that operate on that data. They provide a way to define and instantiate objects with specific characteristics. Here's how you can use classes in TypeScript with code examples:

Declaring a Class:
You declare a class using the class keyword, followed by the class name and a pair of curly braces containing the class members (properties and methods).

class Person {
  // Properties
  name: string;
  age: number;

  // Constructor
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  // Methods
  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

Enter fullscreen mode Exit fullscreen mode

In this example, we've declared a Person class with properties name and age, and a constructor to initialize these properties. We've also defined a greet method to display a greeting message.

Creating Instances of a Class:
To create an instance of a class, you use the new keyword followed by the class name, and you can pass arguments to the constructor.

const alice = new Person("Alice", 30);
const bob = new Person("Bob", 25);

alice.greet(); // Output: Hello, my name is Alice and I am 30 years old.
bob.greet();   // Output: Hello, my name is Bob and I am 25 years old.

Enter fullscreen mode Exit fullscreen mode

You can create multiple instances (objects) of the same class, each with its own property values.

F. Functions

In TypeScript, functions are similar to functions in JavaScript, but TypeScript allows you to define function types and provide type annotations for function parameters and return values. This helps catch type-related errors at compile-time. Here's how you can use functions in TypeScript with code examples:

Function Declaration:
You can declare a function in TypeScript using the function keyword. You can specify the parameter types and return type with type annotations:

function add(a: number, b: number): number {
  return a + b;
}

Enter fullscreen mode Exit fullscreen mode

In this example, we've declared a function named add that takes two parameters, a and b, both of type number, and it returns a value of type number.

Function Expression:
You can also define functions using function expressions and arrow functions:

const subtract = (a: number, b: number): number => {
  return a - b;
};

Enter fullscreen mode Exit fullscreen mode

Here, subtract is defined as a variable holding an arrow function with type annotations for parameters and return value.

Optional Parameters:
You can make function parameters optional by adding a ? after their names:

function greet(name: string, age?: number): string {
  if (age !== undefined) {
    return `Hello, ${name}! You are ${age} years old.`;
  } else {
    return `Hello, ${name}!`;
  }
}

console.log(greet("Alice"));        // Output: Hello, Alice!
console.log(greet("Bob", 25));      // Output: Hello, Bob! You are 25 years old.

Enter fullscreen mode Exit fullscreen mode

In this example, age is an optional parameter, and you can call the greet function with or without it.

Function Types:
You can define function types to specify the structure of functions that you can use as arguments or return values:

type MathFunction = (a: number, b: number) => number;

const add: MathFunction = (a, b) => a + b;
const subtract: MathFunction = (a, b) => a - b;

Enter fullscreen mode Exit fullscreen mode

In this example, we've defined a MathFunction type that describes a function taking two number parameters and returning a number. Then, we've assigned the add and subtract functions to variables of this type.

G. Modules

In TypeScript, modules are a way to organize and encapsulate code into separate files and scopes. Modules allow you to split your codebase into smaller, manageable pieces, making it easier to maintain and share code between different parts of your application. TypeScript supports both CommonJS and ES6 module syntax for defining and using modules. Here's an explanation of modules in TypeScript with code examples:

CommonJS Modules:
CommonJS is a module system used in Node.js and can also be used in TypeScript for server-side or non-browser applications.

Exporting from a Module:
In a TypeScript module, you can use the export keyword to export variables, functions, or classes that you want to make accessible in other modules.

// math.ts
export function add(a: number, b: number): number {
  return a + b;
}

Enter fullscreen mode Exit fullscreen mode

Importing from a Module:
You can use the import keyword to import elements from another module.

// app.ts
import { add } from "./math";

const result = add(5, 3);
console.log(result); // Output: 8

Enter fullscreen mode Exit fullscreen mode

H. Generics

Generics in TypeScript provide a way to create flexible and reusable code components that can work with different data types while maintaining type safety. They allow you to define functions, classes, and interfaces in a way that accepts a type as a parameter, making your code more versatile and maintainable. Here's an explanation of generics in TypeScript with code examples:

Generic Functions:
A generic function is a function that can work with different data types based on the type parameter(s) it receives. You define type parameters by using angle brackets <T>, <U>, or any other identifier within the function's signature.

function identity<T>(arg: T): T {
  return arg;
}

// Usage with type inference
const result1 = identity(5);     // result1 is of type number
const result2 = identity("abc"); // result2 is of type string

Enter fullscreen mode Exit fullscreen mode

In this example, the identity function takes a type parameter T, which allows it to accept and return values of the same type. TypeScript infers the type of T based on the argument provided during the function call.

Generic Classes:
You can create generic classes by specifying type parameters for the class definition. These type parameters can be used within the class just like regular types.

class Box<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

// Usage
const numberBox = new Box(42);
const stringBox = new Box("Hello, Generics!");

console.log(numberBox.getValue()); // Output: 42
console.log(stringBox.getValue()); // Output: Hello, Generics!

Enter fullscreen mode Exit fullscreen mode

In this example, the Box class is generic with type parameter T, allowing it to store and retrieve values of any type.

I. Enum

In TypeScript, an enum (short for "enumeration") is a data type that allows you to define a set of named constant values. Enums provide a way to create a collection of related values with human-readable names, making your code more expressive and self-documenting. Here's an explanation of enums in TypeScript with code examples:

Basic Enum:
You define an enum using the enum keyword, followed by the enum name and a list of named constant values enclosed in curly braces:

enum Color {
  Red,
  Green,
  Blue,
}

let chosenColor: Color = Color.Green;
console.log(chosenColor); // Output: 1 (the numeric value of Green)

Enter fullscreen mode Exit fullscreen mode

In this example, we've defined an enum named Color with three constants: Red, Green, and Blue. Each constant is assigned a numeric value automatically, starting from 0 for the first constant and incrementing by 1 for each subsequent constant.

Accessing Enum Values:
You can access the values of an enum by their names or by their numeric values:

let colorName: string = Color[1]; // Accessing by numeric value
console.log(colorName); // Output: "Green"

Enter fullscreen mode Exit fullscreen mode

Custom Enum Values:
You can explicitly set custom numeric values for enum constants:

enum Day {
  Sunday = 1,
  Monday = 2,
  Tuesday = 3,
  Wednesday = 4,
  Thursday = 5,
  Friday = 6,
  Saturday = 7,
}

Enter fullscreen mode Exit fullscreen mode

In this case, we've assigned specific numeric values to each day of the week.
Enums are a valuable tool in TypeScript for creating more expressive and type-safe code, especially when dealing with predefined sets of values. They improve code readability and help prevent certain kinds of bugs by providing a clear and consistent way to represent constants.

Conclusion:

This typescript practical guide aims to enhance your understanding of TypeScript. It covers the fundamentals of TypeScript, equipping you with the knowledge to elevate your programming skills and mastery. I trust you'll find it valuable and beneficial for your learning journey

Top comments (0)