2018-06-03

flowのClass Typesよいかも 

そういや、まだ使ってなかった。(なぜか string, number くらいしか使ってなかった。)なんとなく RubyKaigi の型TL眺めてて思い出した。

Class Types | Flow

そもそもプロパティの宣言が必要

前からだっけ? v 0.73.0 で確認。

// @flow
class Receiver {
  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ {}

new Receiver(new Differ())

まずこの状態だと property sender is missing と怒られる。

incompatible

で、property 宣言を足すと、

// @flow
class Receiver {
  sender: Sender

  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ {}

new Receiver(new Differ())

以下のように怒られる。

Cannot assign obj to this.sender because Differ [1] is incompatible with Sender

class が違うので意図通り。

継承は見てくれる

// @flow
class Receiver {
  sender: Sender

  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ extends Sender {}

new Receiver(new Differ())

No errors!

よしよし。

まぁ「そもそも引数の型で見てくれ」という意見もありそうだけど。(別に引数には絶対に書かないぞという宗派ではないけど、できれば書きたくはない。)

まとめ

なんでこんな初歩的なことを確認してるかというと、その昔試した PHP の Type Hinting が継承したクラスを認めないという仕様だったため、それ以来 Type Hinting に対してすごくネガティブな気持ちを持っていたんだけど、まぁ普通こうだよなと確認して安心しているわけです。(もしかしたら今は違うのかな? もう試したいとも思ってないんだけど)

About

例によって個人のなんちゃらです