0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

型の間の関係 - Typescript & Angular 勉強会 #8

Last updated at Posted at 2020-10-21
1 / 4

型のサブタイプとスーパータイプ

  • サブタイプとは、派生型のこと。サブタイプから見た派生元をスーパークラスと言う
  • オブジェクト指向言語では、一般的には継承によって表現される

上記において、ChatServiceがスーパータイプ、ApiChatService / WebSocketChatService がサブタイプになる

  • 一般的に、サブタイプはスーパータイプに割当が可能である
    • これを型の共変性という。

型の共変性を活用した設計

  • 前回話したデザインパターンの多くは、この型の共変性を活かした設計をしている
  • スーパータイプを利用するようにしておくことで、型の共変性により任意のサブタイプを実際には代入されてもよくなる
    • 機能追加によるコードの変更範囲を絞ることができる

上記例で言えば、仮にChatサービスの実装方法がWebSocketからAPIに変わったとしても、上位のクラスへの影響がない、という状態にできる。


型の反変性

  • 反変性とは、共変性の反対の性質、すなわち サブタイプにスーパータイプが割り当て可能な場合をいう
  • 代表的なものとして、 関数オブジェクトにおけるメソッドの引数 がある。
type ElementClickEvent = ElementEvent & {
  position: {x: number, y:number}
}

type ButtonClickEventHandler = (e: ElementClickEvent) => void

let handler: ButtonClickEventHandler

handler = (e: ElementEvent) => {console.log(e.message)} //反変性

type ElementMultiClickEvent = ElementClickEvent & {
  clickCount: number
}

handler = (e: ElementMultiClickEvent) => {} //共変性をサポートしない
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?