概要
- 型定義するときに
type
とinterface
二つの方法があるが、どちらが良いか迷ったので調べた - インターフェイスを使うと、ビルド成果物の中の
d.tsファイル
の容量が小さくなるらしい
Interface(インターフェース)
interface User {
name: string;
}
interface User {
age: number;
}
// User型は自動的に { name: string; age: number; } にマージされる
-
拡張可能(拡張性):
interface
は拡張可能です。これは、同じ名前のinterface
を複数回宣言すると、それらが自動的にマージされることを意味します - 新しい型の作成: オブジェクトや関数の型を定義するために使用されます
- 宣言のマージ: 同じ名前のインターフェースが存在する場合、それらの宣言は一つのインターフェースにマージされます
Type(型エイリアス)
type User = {
name: string;
age: number;
};
type Employee = User & {
company: string;
};
-
非拡張可能:
type
は拡張できません。同じ名前で複数のtype
を宣言することはできません -
ユニオン型や交差型などの複雑な型の作成:
type
はプリミティブ、ユニオン、交差、タプルなど、任意の複雑な型の作成に使用できます - 型の再利用: 既存の型を組み合わせて新しい型を作ることができます
typeとinterfaceの違いまとめ
-
拡張性:
interface
は拡張可能であり、同じ名前のインターフェースが自動的にマージされますが、type
は拡張できません -
複雑な型の作成:
type
はより複雑な型の表現(ユニオン型、交差型、タプルなど)に適しています -
使用の推奨: 一般的に、オブジェクトの型を定義する場合は
interface
が推奨されますが、より複雑な型の操作が必要な場合はtype
が適しています
本題
Googleさん的にはインターフェイスを推奨しているらしい
TypeScript は、型式 に名前を付けるための型エイリアスをサポートしています 。これは、プリミティブ、ユニオン、タプル、およびその他のタイプに名前を付けるために使用できます。
ただし、オブジェクトの型を宣言する場合は、オブジェクト リテラル式の型エイリアスの代わりにインターフェイスを使用します。
インターフェイスを使うと、d.tsファイルの容量が小さくなるらしい
昨日、コードを 1 行変更することで TypeScript 宣言を 700KB から 7KB に縮小しました 🔥
つまりどういうこと
type
エイリアスを使用して複雑な型を定義すると、TypeScriptのコンパイラはこれをインラインで展開してしまう可能性があります。
これは、出力される.d.ts
ファイルのサイズを大きくすることがあります。
type Point = {
x: number;
y: number;
};
type Circle = {
center: Point;
radius: number;
};
上記の例で、Circle
型はPoint
型を使用しています。
コンパイラがこれをインラインで展開すると、Point
型の定義がCircle
型に直接含まれる形になります。
interfaceの例
interface
を使用すると、TypeScriptのコンパイラは名前での参照を維持し、.d.ts
ファイルがコンパクトに保たれる傾向があります。
interface Point {
x: number;
y: number;
}
interface Circle {
center: Point;
radius: number;
}
この場合、Circle
インターフェースはPoint
インターフェースを名前で参照します。
このため、.d.ts
ファイルにおいてはPoint
の定義が直接Circle
に組み込まれることはありません。
まとめ
- 型定義には基本的にinterfaceを使おう
- 複雑な型(ユニオン型、交差型、タプルなど)が必要なときはtypeを使うときもある