kage1020
@kage1020 (kage1020)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

TypeScriptにおいてIndex SignatureとGenericsの組み合わせは可能か

解決したいこと

同じ構造をもつObjectが複数あるとします.

// data1
{
  prop1: {
    count: 0
  },
  attr2: {
    count: 2
  },
}

// data2
{
  foo1: {
    count: 1
  },
  bar4: {
    count: 0
  },
}
...

それぞれのObjectのkeyが不変でない時,通常はそれぞれの型を以下のように定義すると思います.

type Data1Type = {
  [key: string]: {
    count: number
  }
}
// もしくは
type Data1Key = keyof typeof data
type Data1Type = {
  [key in Data1Key]: {
    count: number
  }
}

data2以降も同様に定義されますが,省略します.
ここで,dataの構造は同じであるためGenericsを使って抽象化できないかと考えました.

失敗例
type DataType<K> = {
  [key in K]: {       // 型 'K' を型 'string | number | symbol' に割り当てることはできません。
    count: number
  }
}

const data: DataType<keyof typeof data1> = Object.entries(data1).reduce(...)

しかし,このコードではうまく定義できません.何かいい方法はあるでしょうか?

あまり良い定義方法ではないことを前提の上で解答よろしくお願いします.

発生している問題・エラー

型 'K' を型 'string | number | symbol' に割り当てることはできません。
0

1Answer

Kの型を制約すればいけます。

type DataType<K extends string | number | symbol> = {
  [key in K]: {
    count: number
  }
}
1Like

Comments

  1. @kage1020

    Questioner

    なるほど!
    このままだと`K`は`any`だから、keyにできない型であるとしてエラーが出てたのですね。
    extendsは思いつきませんでした。ありがとうございました。

Your answer might help someone💌