オブジェクトの型定義。interfaceは宣言マージ可、typeは柔軟な型表現が可能
// interface: 宣言マージ可能
interface User { id: number; name: string; }
interface User { email: string; } // 同名で追加可能
// type: ユニオン・インターセクションが可能
type Result<T> =
| { data: T; error: null }
| { data: null; error: Error };ライブラリのパブリックAPIにはinterfaceを使うと拡張しやすい。ユニオン型・マップ型などの高度な型表現にはtypeを使う。