🦩
TypeScript 学習記録 #6(InterfaceとType Alias)
TypeScript 学習記録 #5 の続編。
今回のメインテーマ、「InterfaceとType Aliasについて」。
今回主に参考にした教材:
見返す用リスト(主に自分用)
TypeScript基礎学習を完走したので、いつでも見返すことの出来るようにリスト化しておく(5/17)
- TypeScript 学習記録 #1(学習ルート策定やTS参考教材一覧)
- TypeScript 学習記録 #2(TS / ESLint / Prettierの環境構築)
- TypeScript 学習記録 #3(基本の型定義・関数の型定義)
- TypeScript 学習記録 #4(オブジェクトと配列の型定義)
- TypeScript 学習記録 #5(ジェネリック型(ジェネリクス))
- TypeScript 学習記録 #6(InterfaceとType Alias)
- TypeScript 学習記録 #7(非同期処理の型定義(Promise))
- TypeScript 学習記録 #8(Reactに関わる型定義)
InterfaceとType Alias
以下のことについて学んだ。
- InterfaceとType Alias(型エイリアス)の違い
-
Interface
とType Alias
の特徴の違い - 現在、機能面ではどちらも大差はない
- 拡張性が高いのは
Interface
だが、その拡張性が必要となるかどうかはケースバイケース -
Interface
はextends
によって、元の型を継承したサブインターフェースを作ることが出来る(Type Alias
で作成した型をextends
することも出来る)
-
違いまとめ(動画参照)
Interface | Type Alias | |
---|---|---|
用途 | オブジェクト・クラス・関数の構造を定義するため | 複数の場所で再利用する型に名前をつけるため |
拡張性 | 同名のinterfaceを宣言すると型がマージ | 同名のtypeを宣言するとエラー |
継承 | extendsによる拡張ができる | 拡張は不可。交差型で新しい型エイリアスを作る |
使用できる型 | オブジェクトと関数の方のみ宣言できる | オブジェクトや関数以外のプリミティブ、配列、タプルなども宣言できる |
いつ使う | ライブラリ開発ではInterface? | アプリ開発ではType Alias? |
それぞれの型定義の方法(基本的にはほとんど同じ)
// Interfaceでの型定義
interface Knight {
hp: number;
sp: number;
weapon: string;
swordSkill: string;
}
// Type Aliasでの型定義
type Knight = {
hp: number;
sp: number;
weapon: string;
swordSkill: string;
};
// Interface と Type Alias のどちらの型を使っても同じ
const player1: Knight = {
hp: 100,
sp: 30,
weapon: "木の剣",
swordSkill: "みだれ斬り",
};
Interface
Interface
は、同名のInterface
を宣言すると、型が追加(マージ)される。
// Interface
interface Bread {
calories: number;
}
// 同名のInterfaceを宣言すると型が追加(マージ)される
// この時点で型`Bread`は`calories`と`type`という2つの属性を持っている
interface Bread {
type: string;
}
// `Bread`型を満たす2つの属性を指定しないとエラーになる
const croissant: Bread = {
calories: 200,
type: "croissant",
};
また、Interface
は、元の型を拡張してサブインターフェースを作成することが出来る。
// 元の型
interface Book {
title: string
page: number
}
// 元の型を拡張してサブインターフェースを作成(クラスの継承に似てる)
// Book型が持つ`title`属性と`page`属性を継承している
interface Magazine extends Book {
cycle: "daily", "weekly", "monthly", "yearly"
}
// `Magazine`型を満たす3つの属性を指定しないとエラーになる
const jump: Magazine = {
title: "週刊少年ジャンプ",
page: 300,
cycle: "weekly",
}
Type Alias
Type Alias
は、交差型(Intersection Type:A & B
)を用いて型の結合などをする。
// Type Alias
type Curry = {
calories: number;
spicyLevel: number;
};
type Rice = {
calories: number;
gram: number;
};
// 交差型を用いて型の結合をする(A&B)
type CurryRice = Curry & Rice;
// `CurryRice`型を満たす3つの属性を指定しないとエラーになる
const curryRice: CurryRice = {
calories: 500,
spicyLevel: 5,
gram: 300,
};
ここまでの感想
Interface
とType Alias
の違いについて理解した。基本的にはType Alias
で型定義する方針で必要に応じてInterface
を使い分ける形で運用していこうと思う。
トラハックさんの動画も残すところあと「非同期処理」の回のみとなった。それを見たあと、Reactに関する型定義の方法を色々と調べてまとめて、それが終わったら実際にTypeScriptを用いてじゃけぇさんのReact入門講座をTypeScriptで作り変えることをしようと思う。
楽しくなってきた:-)
Discussion