かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

TypeScript 全てオプショナルなプロパティを引数に取る関数を引数無しで呼び出したい

タイトルのとおりなのだけど、日本語で書くとムズい

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

オブジェクトの各プロパティにデフォルト値を付ける事は当たり前にしてたのに、めちゃくちゃシンプルに引数であるオブジェクト自体にデフォルト引数を付ければ済む事を見落としてた。

また忘れそうだからメモとして残しておく

おわり ₍ᐢ. ̫.ᐢ₎