Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@akameco

flowtypeで存在しないkeyを取り出すときに型エラーを出す

以下のようなジェネリックな関数を定義します。
$Keysを使いオブジェクトのキーを検査します。
これだけでは、実用性があるかはわかりませんが、特定の場合に便利なときがあります。

function getObj<V: Object, O: { [*]: V }, K: $Keys<O>>(obj: O, key: K): V {
  return obj[key]
}

こんな感じで使えます。

function getObj<V: Object, O: { [*]: V }, K: $Keys<O>>(obj: O, key: K): V {
  return obj[key]
}

type User = { name: string }

const user1: User = { name: 'aclie' }
const user3: User = { name: 'bob' }

const users = { id1: user1, id3: user3 }

const v1 = getObj(users, 'id1')
const v2 = getObj(users, 'id2')
const v3 = getObj(users, 'id3')

id2は定義されてないので、型エラーが発生します。

 23: const v2 = getObj(users, 'id2')
                ^^^^^^^^^^^^^^^^^^^^ function call
 23: const v2 = getObj(users, 'id2')
                              ^^^^^ property `id2`. Property not found in
  7: function getObj<V: Object, O: { [*]: V }, K: $Keys<O>>(obj: O, key: K): V {
                                                  ^^^^^^^^ object literal

しかし、データを取り出すために一度関数を通す必要があり取り回しが悪いです。

{ [key: string]: Object }のようなマップオブジェクトのキーの検査は現状諦めています。
もし知見があれば、コメントまたはTwitterまで教えてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?