TypeScript

型定義メモ

文字列リテラルを key にしたオブジェクトの型

以下のような文字列リテラルがあるとする

type KeyType = 'test1' | 'test2' | 'test3'

文字列リテラルのいずれかを key に持つオブジェクトの型

const keyValue: Record<KeyType, string> = {
    'test1': 'value1',
    'test2': 'value2'
}

文字列リテラルの全てを key に持つオブジェクトの型

const keyValue: { [key in KeyType]: string } = {
    'test1': 'value1',
    'test2': 'value2',
    'test3': 'value3'
}

Object.keys とインスタンスメソッドを組み合わせた時の型注釈

Array のインスタンスメソッドを利用して、Object.keys() で列挙したキーにメソッド内でアクセスすると型エラーになる。

type TestType = {
    test1: string
    test2: number
    test3: object
}

const testObj: TestType = {
    test1: "",
    test2: 0,
    test3: {}
}

Object.keys(testObj).map((v) => v[test1])
/*
 * → ERROR
 * 型 'string' の式を使用して型 'TestType' にインデックスを付けることはできないため、要素は暗黙的に 'any' 型になります。
 * 型 'string' のパラメーターを持つインデックス シグネチャが型 'TestType' に見つかりませんでした。ts(7053)
*/

以下のように型定義を入れる方法がよく紹介されている。

(Object.keys(testObj) as (keyof TestType)[]).map((v) => testObj[v])