18
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

interfaceとtypeの違いについて

Last updated at Posted at 2022-05-31

概要

TypeScriptの超初心者の私が、チュートリアルで実際に簡単なアプリケーション制作する際に、型定義の方法として大きく2つあることを知りました。(※直書きを除く)
「interface」と、「type」になります。
初心者の私からすると、「何が違うんだ!?」という印象を持ちました。
なので、今回「interface」と「type」の違いについてまとめました。

interface

interfaceは、構造を定義するものになります。

interface Sample {
  name: string;
  age: number;
  isAdult: boolean;
}
const user: Samle{
  name: "taro";
  age: 10;
  isAdult: false;
}

type(型エイリアス)

typeは、型に対して名前をつけるものです。

type Sample = {
  name: string;
  age: number;
  isAdult: boolean;
}
const user: Samle{
  name: "taro";
  age: 10;
  isAdult: false;
}

interfaceとtypeの違い

違い interface type
拡張(上書きできるか) ×
継承 ×

①拡張

interfaceでは、拡張することができますがtypeは拡張することはできないです。

interfaceの場合

interfaceでは、拡張することが可能です。

interface Window {
  title: string
}

interface Window {
  ts: TypeScriptAPI
}

const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});

typeの場合

typeを作成後に、型を追加することはできません。

type Window = {
  title: string
}

type Window = {
  ts: TypeScriptAPI
}

 // Error: Duplicate identifier 'Window'.

②継承

interfaceでは、interfaceやtypeから継承することができます。
一方typeは、継承することができません。

interfaceの場合

interface User{
  name: string;
  age: number;
}
interface Test extends User{
  English: number;
  Math: number;
}
const Student: Test{
  name: taro;
  age: 10;
  English: 50;
  Math: 80;
}

ただtypeも交差型を使用することで、継承に似たことは実現することは可能です。
ただ交差型では、型の矛盾があった場合でもコンパイルエラーにならないので、注意が必要です。

type User = {
  name: string;
  age: number;  //number型で定義
};

type Test =  User & {
  age: string;  //string型で定義
  English: number;
  Math: number;
};

type Test = {
  name: string;
  age: string; //string型になる
  English: number;
  Math: number;
};

③定義できる型

最後に、interfaceとtypeの定義できる方の違いについて説明します。
interfaceは、「構造を定義するもの」なので、オブジェクトとクラスの型だけ定義することができます。
一方typeは、オブジェクトとクラス以外の他の型も宣言することができます。

type ID = number | string;
//union型も定義可能

結論

公式ドキュメントによると、

「TypeScriptは他の種類の宣言が必要かどうかを教えてくれます。ヒューリスティックが必要な場合は、タイプの機能を使用する必要があるまでインターフェイスを使用してください。」だそうです。

For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you need to use features from type.

interfaceの方が使ってほしそうですが、場合を見てinterfaceとtypeを使い分けてください。ということでした。

interface、typeの仕様の違いを理解した上で使い分けをすることが重要だと思いました。

参考記事

18
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?