かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

TypeScript Object.entries の型をいい感じにしたい

環境

  • TypeScript v5

引数のオブジェクトを Record<string, unknown> とするパターン

返り値に as を使わないとタイプエラーになる

返り値 Entries を定義するパターン

type Entries<T> = (keyof T extends infer U
  ? U extends keyof T
    ? [U, T[U]]
    : unknown
  : unknown)[];

export const strictEntries = <T extends Record<string, unknown>>(
  object: T,
): Entries<T> => {
  return Object.entries(object) as Entries<T>;
};

return Object.entries(object) as Entries<T>; にしないと type error になる

返り値を [keyof T, T[keyof T]][] とするパターン

export const strictEntries = <T extends Record<string, unknown>>(
  object: T,
): [keyof T, T[keyof T]][] => {
  return Object.entries(object) as [keyof T, T[keyof T]][];
};

return Object.entries(object) as [keyof T, T[keyof T]][]; にしないと type error になる

オブジェクトを Record<string, any> にすれば返り値を [keyof T, T[keyof T]][] にすれば as を使わなくても良い

export const strictEntries = <T extends Record<string, any>>(
  object: T,
): [keyof T, T[keyof T]][] => {
  return Object.entries(object);
};

これなら type error にならない

詳しい挙動は調べてないが、どちらでもいい感じに形推論されるようになったからヨシ
おわり


[参考]