知りたいこと
TypescriptでRecord<string, unknown>を引数にとる関数にinterfaceで型付けしたオブジェクトを渡そうとするとエラーになるのですが、その理由を知りたいです。
Type Aliasで型付けすると渡せるので、interfaceとType Aliasの挙動の違いに原因があるのかと思ったのですが、調べても原因を見つけられなかったので、、ご教授いただけると幸いです。
エラーとなるコード
インデックスシグネチャがinterfaceで型付けしたオブジェクトにはありませんといったエラーがでます。
typescript
1const func = <T extends Record<string, unknown>>(obj: T) => obj 2 3interface Target { 4 hoge: string 5} 6 7const target: Target = { 8 hoge: "hoge" 9} 10 11// Argument of type 'Target' is not assignable to parameter of type 'Record<string, unknown>'. 12// Index signature is missing in type 'Target' 13func(target)
Type Aliasで型付けするとエラーになりません。
typescript
1const func = <T extends Record<string, unknown>>(obj: T) => obj 2 3type Target = { 4 hoge: string 5} 6 7const target: Target = { 8 hoge: "hoge" 9} 10 11// OK 12func(target)
interfaceのインデックスの型をstringとしてあげると問題ないようです。
typescript
1const func = <T extends Record<string, unknown>>(obj: T) => obj 2 3// indexをstringと定義 4interface Target { 5 [index: string]: string 6} 7 8const target: Target = { 9 hoge: "hoge" 10} 11 12// OK 13func(target)
補足情報
typescriptのバージョンは4.1.3です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/08 13:50
2021/03/09 06:46
2021/03/11 12:32