TypeScript インデックスシグネチャを使うときの注意点

以下のコードは、T1 は hoge プロパティは string でそれ以外は number としたい意図です。

type T1 = {
    hoge: string
} & {
    [x: string]: number
}

const a: T1 = {
    hoge: 'hoge',
    foo: 100,
}

しかし、このコードはエラーになります。

hoge は number を期待するのに、string になっているため、怒られます。

これは [x: string]: number により、すべてのプロパティが number と期待されてしまうからです。

この動作の改善は過去から行われていますが、いまだに決着していません。

以下の issue を追うと良いです。

https://github.com/microsoft/TypeScript/issues/17867