2
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 5 years have passed since last update.

flowの$ReadOnlyArrayでポリモーフィックなArrayを扱う

Last updated at Posted at 2019-02-18

結論

Array は不変なのに対し $ReadOnlyArray は共変なのでポリモーフィックな型を扱えて便利やで。

ユーザ情報を表す UserT 型とより詳細なユーザ情報を有する UserWithDetailsT 型があるとする。
それぞれの型の関係性は UserTUserWithDetails となっている。

type UserT = { name: string }
type UserDetailsT = { name: string, age: number }

このとき UserTUserDetailsT が混在しうる Array を共通処理しようとして、以下のようにするとエラーとなる。

const userList: Array<UserT> = [{ name: 'alice' }]
const userDetailsList: Array<UserDetailsT> = [{ name: 'bob', age: 20 }]

// Error
const userOrUserDetailsList: Array<UserT|UserDetailsT> = true ? userList : userDetailsList

なぜなら Array は不変(invariant)で Array<UserT>Array<UserDetailsT> に互換性がないため。それに対して $ReadOnlyArray は共変(covariant)なので互換性を持てる([doc](ref: https://flow.org/en/docs/types/arrays/#toc-readonlyarray))。

// OK
const readOnlyUserOrUserDetailsList: $ReadOnlyArray<UserT|UserDetailsT> = true ? userList : userDetailsList

Try flow でも確認してみる。

意気込み

上記のメリットに加え、 Array.prototype.push などによる Array への副作用も基本的に好ましくないので、今後は特に何も考えずに $ReadOnlyArray を使っていく所存。

2
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
2
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?