Upgrade to Pro — share decks privately, control downloads, hide ads and more …

関係性から理解する"同一性"の型用語たち

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 関係性から理解する"同一性"の型用語たち

Avatar for pvcresin

pvcresin

May 22, 2026

More Decks by pvcresin

Other Decks in Programming

Transcript

  1. TypeScriptの話題において、nominal / structural / branded / opaque / phantomといった 型に関する用語を見かける機会が増えてきました。

    しかし、これらの違いや関係性を説明しようとすると曖昧になりがちです。 私自身も「なんとなく分かったつもり」で流してしまった過去があり、 後からうまく説明できずに後ろめたさを感じる場面がありました。 本発表ではTypeScriptが構造的型付けであることを起点に、 型の同一性に関するこれらの用語を、コード例を交えて紹介します。 そのうえで、これらの違いと関係性を理解し、解説記事や議論を追える状態を目指します。  トーク概要
  2. Nominal/Structural Nominal Typing(名前的型付け) - 公称型とも呼ばれる - 名前や継承などで型を判別 - Java, C#,

    Kotlin, Go(struct)など Structural Typing(構造的型付け) - 構造的部分型とも呼ばれる - 構造で型を判別 - TypeScript, Go(interface)など
  3. Goose Typing - 実行時に対象の値が特定のクラスに 属しているかで型を判定 - Python(ABC + isinstance), Ruby(is_a,

    kind_of, instance_of), JavaScript(instanceof)など Duck/Goose Duck Typing - 実行時にその値が特定のメソッドや プロパティを持っているかで型を判定 - コードの再利用性を高められる - Python, Ruby, JavaScriptなど
  4. プリミティブ型に関する課題 - 手軽に使えるため、プリミティブな値で管理する場面は多い - ID(UserId, GroupId, …) - 単位(JPY, USD,

    …) - 特定の文字列(Email, URL, …) - すべてがstringやnumberに潰れがちで、取り違えのリスクが高い - 一方、クラスは構造がユニークになることが多く、問題になりづらい
  5. 型用語の関係性 実装に使う 生成口絞る Branded Type (ブランド型) 識別子を混ぜて型を判別 Opaque Type (不透明型)

    型の実体を外部に教えない Phantom Type (幽霊型) 状態を型パラメータで持つ 判定タイミング 判定方式 Structural Typing (構造的型付け) 構造で型を判別 Nominal Typing (名前的型付け) 名前で型を判別 Goose Typing 実行時に 名前で型を判別 Duck Typing 実行時に 構造で型を判別 判定方式 Nominal模倣