Closed1

TypeScriptによる型定義の記述方法に関して

おとのおとの

interfacetypeのどちらを使うべきか

(本件に1つの正解はないということを前提に踏まえた上で)interfaceの再宣言による拡張で意図しない問題が発生しかねないので、typeに統一して使う方が安全だと考える。

interfaceを使うことで、一部の条件でビルド時にキャッシュが効いたり、typeを使うことで(限定的に)発生する不安定な挙動も避けることができるが、それらを上回りtypeを使う上記メリットの方が大きいと個人的に感じている。

拡張が可能かどうか

interdaceは拡張できるが、typeは拡張できない。例は以下の通り。

// 下記の記述(拡張)が可能
interface hoge {
  foo: string;
}

interface hoge {
  bar: number;
}

const hogehoge: hoge = {
  foo: "jack",
  bar: 0
};
// 下記それぞれに「識別子 'hoge' が重複しています」というエラーが発生する
type hoge = {
  foo: string;
}

type hoge = {
  bar: number;
}

Union Type、Tuple Type、Mapped Typesが利用可能かどうか

Typeでは下記記述のような型設定が可能になる。

// Union
type Hoge = "fuga" | "piyo"

// Tuple
type Foo = [number, string]

// Mapped Types
type Butterfly = {
  [key in Hoge]: string;
};

参考

このスクラップは2024/11/29にクローズされました