エイリアス型(type)
下記のように記述します。エイリアス名の先頭文字は大文字にするのが規則になっているので気をつけましょう。
1 |
type エイリアス名 = :既存の型; |
実装例
1 |
type Str = :string; |
typeofについて
「変数名2の型」を抽出して「変数名1の型」に代入する事が可能です。仮に変数名2の型が今後変更されることになったとしてもtypeofを使って記述していれば追従して合わせる事が可能になり保守性が上がります。
1 |
type 変数名1 = typeof 変数名2; |
交差型(intersection型)
既存の型を生かしつつ新たな型を作っていく合理的な型になります。
実装例
下記のように既存の型を&を使って結合して新たな型を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type a = { name: string; }; type b = { age: number; }; type c = a & b; const d: c = { name: '田中', age: 24, }; |
interface
typeとほぼ同じ使い道でinterfaceがあります。typeはstringやnumberなどオブジェクト以外の別名というような用途でも使うことができましたが、interfaceの用途はオブジェクトに限られます。
1 2 3 4 |
interface インターフェイス名 { 変数1: データ型1; 変数2: データ型2; } |
readonly
class構文とかで使えるreadonlyは普通にinterfaceにもつけることが可能です。
1 2 3 |
interface インターフェイス名 { readonly 変数1: データ型1; } |
継承
1 2 3 |
interface インターフェイス名 extends 別インターフェース名 { 変数1: データ型1; } |
なお、継承させる対象はinterfaceでもtypeでもどちらも使うことができます。
メリット
わかりやすい。
interfaceはtypeと違ってオブジェクトしか扱えません。なのでinterfaceを使っている場合はobjectなのだなとすぐに理解することができてtypeに比べて他の開発者の理解へも優しい文法になります。
拡張性が高い
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
interface person { name: string; age: number; } interface person { height: number; } ----↓↓↓こうなっている。↓↓↓---- interface person { name: string; age: number; height: number; }で |
デメリット
知らない間に拡張されてしまっている可能性がある。
typeとの使い分けは?
一概にどちらを使えば良いということはありませんし、ほとんど違いはないです。
ただ、オブジェクトやclassを使う場合はinterfaceを使った方が良いでしょう。なぜならtypeはオブジェクト以外にもデータ型を扱えてしまうので他の開発者にわかりづらくなってしまうためです。
業務上はどちらの仕様を押さえた上で使いやすい方を選ぶことになります。一般的にはinterfaceの方がよく利用されているようです。interfaceには既存の型を拡張する事ができる「マージ機能」という機能があります。
この記事へのコメントはありません。