タイトルのとおりなのだけど、日本語で書くとムズい
type MyFuncArgumens = { defaultValue?: number; callback?: () => void; }; const myFunction = ({ defaultValue = 1; callback }: MyFuncArgumens) => { // ... };
全てオプショナルなプロパティを持つオブジェクトを引数に取る関数 myFunction
がある
何もプロパティを渡さない時に引数無しで呼び出したいが、上記の定義では Type Error になる
myFunction(); // -> Expected 1 arguments, but got 0 // -> An argument matching this binding pattern was not provided.
Expected 1 arguments, but got 0
引数の数が合わないエラーになる。
それはそう。
引数自体を partial にしても同様にエラーが発生する
const myFunction = ({ defaultValue = 1; callback }: MyFuncArgumens | undefined) => { // ... }; myFunction(); // -> Expected 1 arguments, but got 0
引数なしの呼び出しは呼び出された関数の引数が undefined
型として扱われる訳ではない
引数に空オブジェクト {}
を渡して myFunction({})
とすれば問題ないが、イケてない。こういう場合は myFunction()
で呼び出したい。
関数のデフォルト引数を空オブジェクト {}
にすれば OK
シンプルに関数のデフォルト引数そのものを空オブジェクトにすればよい。
type MyFuncArgumens = { defaultValue?: number; callback?: () => void; }; const myFunction = ({ defaultValue = 1; callback }: MyFuncArgumens = {}) => { // ... }; myFunction(); // OK
オブジェクトの各プロパティにデフォルト値を付ける事は当たり前にしてたのに、めちゃくちゃシンプルに引数であるオブジェクト自体にデフォルト引数を付ければ済む事を見落としてた。
また忘れそうだからメモとして残しておく
おわり ₍ᐢ. ̫.ᐢ₎