そういや、まだ使ってなかった。(なぜか string, number くらいしか使ってなかった。)なんとなく RubyKaigi の型TL眺めてて思い出した。
そもそもプロパティの宣言が必要
前からだっけ? 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 に対してすごくネガティブな気持ちを持っていたんだけど、まぁ普通こうだよなと確認して安心しているわけです。(もしかしたら今は違うのかな? もう試したいとも思ってないんだけど)