TypeScriptでMapオブジェクトを使うと型の担保ができてるのに?Optional chaining)を使わなければエラーが消えなかったので型定義を上書きしたった。

ソースコードは以下。

// common.d.ts
declare interface Map<K, V> {
  get(key: K): V
  has(key: unknown): key is K;
}

hasgetもMapオブジェクトが持つメソッドだがgetする前にhasで判定していても未定義の可能性があると怒られる。

type A = 1 | 2 | 3

const map = new Map<A, { name: string }>([
  [1, { name: '' }],
  [2, { name: '' }],
  [3, { name: '' }],
])

let value = 1
if (map.has(value)) { // <-エラーがなくなる
  const name = map.get(value).name // <-エラーがなくなる
}

もちろん常に同一でない使い方をする際は使い物にならないので、定数のような使い方で統一する場合にのみ有効。
もう少し厳密化すると「getの引数がKに当てはまっていればVを返し、そうでなければundefinedを返す」といった形にもできる。(できるとはいってない)

プロフィール画像

ふじわら

よくわからないもので戯れてたら自分のことすらよくわからない人間になってしまいました。

ひっそりYouTubeしてます。