インターフェースを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;