Yanonoblog!

こつこつと

TypeとInterfaceの違い

はじめに

TypeScriptの開発における型定義では主にTypeとInterfaceが使われますが、2つの違いについて調べたので書いていきます。

継承方法の違い

interfacetypeの両方ともTypeScriptで継承を実現することができますが、それぞれ異なる方法で行います。

interfaceの場合

interfaceextendsキーワードを使用して他のinterfaceを継承することができます。

interface Animal {
  name: string;
}

interface Dog extends Animal {
  breed: string;
}

let myDog: Dog = {name: "Rex", breed: "German Shepherd"};

interfaceの継承は、オブジェクト指向プログラミングの継承と同じ使い方のため直感的です。

typeの場合

typeは交差型(&演算子)を使用して他の型を"継承"することができます。

交差型は、複数の型を組み合わせて新しい型を作成する方法です。

新しい型は組み合わせた各型の特性をすべて持っているという関係です。

type Named = {
  name: string;
};

type Aged = {
  age: number;
};

type Person = Named & Aged;

再宣言(同名の定義)を行ったときの挙動の違い

interfaceの場合
interface User {
    name: string;
}

interface User {
    age: number;
}

let user: User = {
    name: 'Alice',
    age: 25
};

ここでは、Userという同じ名前のinterfaceを2つ定義していますが、interfaceの場合は自動的にマージされます。

したがって、userオブジェクトはnameageの両方のプロパティを持つことができます。

typeの場合
type User = {
    name: string;
};

type User = {
    age: number;
}; // Error: Duplicate identifier 'User'.

一方、typeでは同じ名前で複数の型を定義することはできません。したがって、このコードはエラーになります。

交差型、共用体型、タプル型などが使えるかの違い

interfaceとtypeでは用途の違いや、交差型、共用体型、タプル型などが使えるかの違いがあります。

interfaceの場合

interfaceは主にオブジェクト型の定義やクラスの型を指定する際に使用されます。

interfaceは他のinterfaceを継承することで新しいinterfaceを作成することが可能ですが、交差型(&演算子)を使用して複数のinterfaceを合成することはできません。また、タプル型や共用体型も直接定義することはできません。

interface Point {
    x: number;
    y: number;
}

interface Point {
    z: number;
}

let point: Point = {x: 10, y: 20, z: 30};  // This is fine
typeの場合

typeはより汎用的な型定義が可能で、interfaceが持つ機能に加えて、交差型、共用体型、タプル型などを用いた型定義が可能です。

交差型を使用すれば、複数の型の特性を全て持つ新たな型を作成できます。

type Part1 = { a: number };
type Part2 = { b: number };
type Combined = Part1 & Part2;  // { a: number; b: number 

共用体型は、いくつかの型の1つを表す型を定義できます。

type StringOrNumber = string | number;

タプル型を用いると、要素の数と型が固定された配列を表すことができます。