TypeScriptのtypeとinterfaceの違う部分を少し見る

typeはエイリアスであり、いろんな型を表すことができる

type A = number
type B = number | string
type C = {
  name: string
  age: number
}

interfaceはnumberとかnumber | stringのエイリアスは作れない

type A = number // error
type B = number | string // error
interface C { // ok
  name: string
  age: number
}

typeはオブジェクト型の交差には & を使用する

type A = {
  name: string;
};

type B = {
  age: number;
};

type Profile = A & B;

const profile: Profile = {
  name: 'name',
  age: 23,
};

interfaceはextendsで拡張する

interface A {
  name: string;
}

interface Profile extends A {
  age: number;
}

const profile: Profile = {
  name: 'name',
  age: 23,
};

interfaceは宣言のマージができる。
マージされたすべてのプロパティに従わなければいけない

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

interface Profile {
  sex: string;
}

const user: Profile = {
  name: 'name',
  age: 23,
  sex: 'men',
};

typeは宣言のマージはできない

// error
type Profile = {
  name: string;
  age: number;
};

type Profile = {
  sex: string;
};