TypeScriptのIndex Signatureでプロパティに制限をかけたかったので、今更ながらよくよく調べてみた
nove-b
September 26, 2023
Index Signatureを使用することでプロパティの型を指定することができる。
例えば、
上記のようにnumber型という風に明示的に宣言することで、Stringという文字列をkeyに指定したことでエラーを吐かせることが可能である。
逆にIndex Signatureを文字列という風に明示的に宣言することで、1というKeyがエラーを吐きそうだが、
> This is because when indexing with a number, JavaScript will actually convert
> that to a string before indexing into an object
という風に文字列にしてからアクセスするので問題ないということで、エラーは出ない。
Index Signatureでは特定の文字列を持つプロパティのみを制約することはできない
じゃあ、keyが特定の文字列のみの場合はどうすればいいか?
上記の記述すると、
というエラーが出る。
エラーが出たコードを実現しようとすると
という風に記載することで解決できる。
そもそもIndex Signatureの定義が
> Sometimes you don’t know all the names of a type’s properties ahead of time,
> but you do know the shape of the values.
という風に型のプロパティ名を事前にすべて把握していない場合に使用する物なので、そもそも実現しようとしていることが間違え。
間違えだけれど、ちなみに、Typeを使用することで、上記のような書き方で実現することができる。
InterfaceとTypeの違いは別で調べたい。
Discussion in the ATmosphere