INDEX

Typescript - Getting started

By Adrian Barbic at

Recently started using Typescript more and more and this blog post covers some of the basics around Typescript.

Running Typescript

If you have node installed you can run npx tsc index.ts and this will transpile your Typescript file into a Javascript file .js in the same folder.

You can specify the out put file to be in a different folder by adding the --outfile command like this npx tsc index.ts --outfile ./src/index.js which will add the output to the src folder.

Types and interfaces

Type and interfaces are both very similar in thier use, here we will look at the main differences.

Types

type Person = {
  name: string,
  age: number,
};

You can see that this syntax is very similar to a plain Javascript object, but rather than having a const we have type. The Person name can be any word you like.

Interfaces

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

This interface is almost identical with regards to syntax, it just replaces type with interface and omits the = operator.

So what is the main difference between Types and Interfaces? People seems to be divided on weather to use Types and Interfaces so it really feels like more of a preference, they both have a lot of overlap. But calling out some of the main features are:

Interfaces allow extends

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

interface ImprovedPerson extends Person {
  height: number;
}

With type you can do something similar but it's not as clean:

type ImprovedPerson = Person & { height: number };

Types allow matching on string list

type Colors = "Blue" | "Red" | "Black";

How to apply types and interfaces?

A standard Javascript function would look like this:

const greet = (person) => {
  return "Hello " + person.name;
};

In Typescript we need to add the types for person with person: Person which will look like the below function:

const greet = (person: Person) => {
  return "Hello " + person.name;
};

Now when we use the function greet it will make sure that we pass in a object that contains both name and age values or Typescript will warn us.

Types for function returns

You can also add types to function returns by declaring them exactly the same way as before and adding them after the function parentheses like so

type PersonReturn = {
  name: string,
  isValid: boolean,
};

const greet = (person: Person): PersonReturn => {
  return { name: person.name, isValid: true };
};

If the function doesn't have a return statement you can set the return type to be void.

const greet = (person: Person): ({ name: string }) => void {
  console.log({ name: person.name });

  return true;
}

Pick

If we have a type object already setup and have a function where we don't need all the types we can use Pick to select the types we do need.

type OtherPerson = Pick<Person, "name">;

const greet = (person: OtherPerson) => {
  return { name: person.name };
};

greet({ name: "James" });

Omit

We can do the same from the other way by omitting the vales that we don't want.

type OtherPerson = Omit<Person, "name">;

const greet = (person: OtherPerson) => {
  return { isValid: person.age };
};

greet({ age: 47 });

Setting explicit values

type Colors = "Blue" | "Red" | "Black";
const myColors: Colors = "Red";

React FC

Previously it wasn't ideal to use React.FC as children props were implicitly allowed even when they were not uesd. So no error was thrown in this case.

However you can use it like this:

type Props = {
  children?: React.ReactNode
};
const Component: React.FC<Props> = ({children}) => {...}

Generics