TypeScript - Types: A Beginner's Guide

Hello there, future coding superstar! Today, we're diving into the fascinating world of TypeScript types. Don't worry if you've never written a line of code before – I'll be your friendly guide on this exciting journey. By the end of this tutorial, you'll be amazed at how much you've learned. So, let's get started!

TypeScript - Types

What are Types in TypeScript?

Before we jump into the deep end, let's talk about what types are and why they're important. Think of types as labels we put on our data. Just like how we organize our closet with different sections for shirts, pants, and shoes, types help us organize our code and prevent us from putting a metaphorical sock in the shirt drawer!

TypeScript is a superset of JavaScript that adds optional static typing. This means we can tell TypeScript exactly what kind of data we're working with, which helps catch errors before our code even runs. It's like having a helpful friend looking over your shoulder, pointing out potential mistakes before you make them.

The Any Type: The Wild Card of TypeScript

Let's start with the most flexible type in TypeScript: any. It's like the joker in a deck of cards – it can be anything!

let myVariable: any = 42;
myVariable = "Hello, World!";
myVariable = true;

In this example, myVariable can be a number, then a string, then a boolean. It's very flexible, but with great power comes great responsibility. Using any too often defeats the purpose of using TypeScript, so use it sparingly!

Built-in Types: The Building Blocks of TypeScript

TypeScript comes with several built-in types that cover most of our needs. Let's explore them one by one:

1. Number

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

Numbers in TypeScript can be integers or floating-point values. No need to worry about different number types like in some other languages!

2. String

let name: string = "Alice";
let greeting: string = `Hello, ${name}!`;

Strings can be defined with single quotes, double quotes, or backticks. Backticks allow us to embed expressions using ${}.

3. Boolean

let isStudent: boolean = true;
let hasPassedExam: boolean = false;

Booleans are simple – they're either true or false. Think of them as yes/no questions for your code.

4. Array

let numbers: number[] = [1, 2, 3, 4, 5];
let fruits: Array<string> = ["apple", "banana", "orange"];

Arrays can hold multiple values of the same type. We can define them using square brackets or the Array<T> syntax.

5. Tuple

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

Tuples are arrays with a fixed number of elements, where each element can have a different type. They're like a small, organized box with specific compartments for each item.

6. Enum

enum Color {
  Red,
  Green,
  Blue
}
let favoriteColor: Color = Color.Blue;

Enums allow us to define a set of named constants. They're great for representing a fixed set of options.

7. Void

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

Void is used to indicate that a function doesn't return anything. It's like sending a letter without expecting a reply.

8. Null and Undefined

let notDefined: undefined = undefined;
let empty: null = null;

These types represent the absence of a value. They're like empty boxes – one that's intentionally empty (null) and one that hasn't been filled yet (undefined).

Here's a table summarizing the built-in types we've covered:

Type Description Example
number Numeric values (integer or floating-point) let age: number = 30;
string Textual data let name: string = "Alice";
boolean True or false values let isStudent: boolean = true;
array Collection of values of the same type let numbers: number[] = [1, 2, 3];
tuple Fixed-length array with elements of specific types let person: [string, number] = ["Alice", 30];
enum Set of named constants enum Color { Red, Green, Blue }
void Absence of a return value in functions function logMessage(message: string): void { ... }
null Intentional absence of any object value let empty: null = null;
undefined Variable that hasn't been assigned a value let notDefined: undefined = undefined;

User-defined Types: Crafting Your Own Tools

Now that we've covered the built-in types, let's talk about how you can create your own custom types. This is where TypeScript really shines!

1. Interfaces

Interfaces allow us to define the structure of an object. Think of them as blueprints for objects.

interface Person {
  name: string;
  age: number;
  greet(): void;
}

let alice: Person = {
  name: "Alice",
  age: 30,
  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

In this example, we've defined a Person interface and created an object that adheres to this structure. It's like creating a form that people need to fill out – everyone needs to provide the same information.

2. Classes

Classes are a way to create reusable components. They're like cookie cutters – you define the shape once, and then you can make as many cookies (objects) as you want!

class Student {
  name: string;
  grade: number;

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

  study() {
    console.log(`${this.name} is studying hard!`);
  }
}

let bob = new Student("Bob", 10);
bob.study(); // Outputs: "Bob is studying hard!"

Here, we've created a Student class with properties (name and grade) and a method (study). We can create as many students as we want using this class.

3. Type Aliases

Type aliases allow us to create new names for types. They're useful for creating complex types or giving more meaningful names to existing types.

type Point = {
  x: number;
  y: number;
};

let center: Point = { x: 0, y: 0 };

In this example, we've created a Point type that represents a point in 2D space. It's a simple way to group related properties together.

4. Union Types

Union types allow a value to be one of several types. It's like saying, "This can be either this or that."

type Result = number | string;

function getResult(value: boolean): Result {
  return value ? "Success" : 404;
}

Here, Result can be either a number or a string. This is useful when a value could be of different types depending on certain conditions.

5. Intersection Types

Intersection types combine multiple types into one. It's like saying, "This must be this AND that."

interface Colorful {
  color: string;
}

interface Circle {
  radius: number;
}

type ColorfulCircle = Colorful & Circle;

let myCircle: ColorfulCircle = {
  color: "red",
  radius: 5
};

In this example, ColorfulCircle is both Colorful and a Circle. It must have both a color and a radius.

And there you have it! We've covered the basics of TypeScript types, from the flexible any type to built-in types and user-defined types. Remember, types in TypeScript are like your coding superpowers – they help you write cleaner, more reliable code and catch errors before they become problems.

As you continue your TypeScript journey, keep experimenting with these types. Try combining them in different ways, and don't be afraid to make mistakes – that's how we learn! Before you know it, you'll be typing away like a pro, creating robust and error-free code.

Happy coding, and may your types always be strong!

Credits: Image by storyset