インターフェースをレコードに割り当てることができないのはなぜですか ? 質問する

インターフェースをレコードに割り当てることができないのはなぜですか ? 質問する

インターフェースをRecord<string, unknown>(に割り当てることができないことに気付きました)遊び場リンク):

interface Foo {
    foo: number
}

const foo: Foo = { foo: 1 }
const bar: Record<string, unknown> = foo
//    |-> Error: Type 'Foo' is not assignable to type 'Record<string, unknown>'
//               Index signature is missing in type 'Foo'.(2322)

ただし、型宣言を省略した場合も同様ですFoo遊び場リンク):

const foo = { foo: 1 }
const bar: Record<string, unknown> = foo // no error here

質問:両方の例に違いがあるのはなぜですか? 私にとっては、変数の縮小型はfoo両方の例で同じです... インターフェースFooは に代入可能ではないでしょうかRecord<string, unknown>?

私の理解ではRecord<string, unknown>、はと同等でありobject、したがって任意のインターフェースをそれに割り当てることができるはずです。また、@typescript-eslint/禁止タイプRecord<string, unknown>の代わりにを使用することを提案しますobject

備考:最初の例は、object遊び場リンク) またはRecord<string, any>遊び場リンク) が の代わりに使用されますRecord<string, unknown>

ベストアンサー1

あなたは遭遇した型にインデックス署名がありません (インターフェイスのみ、型エイリアスではありません) #15300

インターフェースを型に変更すると、コードは機能します。

type Foo = {
    foo: number
}

const foo: Foo = { foo: 1 };
const bar: Record<string, unknown> = foo;

おすすめ記事