JSDocでObjectの属性名補完

  • このエントリーをはてなブックマークに追加

TypeScriptで任意の文字列を受け取るが、ある程度の定数を補完したい場合、|'aaa'|'bbb'|(string&{})で定義できる。
これの objectの属性版では{ aaa?: number, bbb?: number, [key: string]: unknown }と定義する。

JSDocでは以下のように定義する。

Record<string, unknown> & { aaa?: number, bbb?: number }

{}で定義するとLinterに怒られる。なのでRecordを使う。

Don't use `{}` as a type. `{}` actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want `object` instead.
- If you want a type meaning "any value", you probably want `unknown` instead.
- If you want a type meaning "empty object", you probably want `Record<string, never>` instead.
- If you really want a type meaning "any non-nullish value", you probably want `NonNullable<unknown>` instead.eslint@typescript-eslint/ban-types

なお警告では Record<string, never> を使えと書いてありますが、この記事では Record<never, never> を使えと書いてある。

参考