我想编写一个函数,该函数接受一个对象参数,在函数签名中使用解构,并使该参数为可选:

myFunction({opt1, opt2}?: {opt1?: boolean, opt2?: boolean})

但是,Typescript不允许我这样做(“绑定(bind)模式参数在实现签名中不能为可选。”)。

如果不进行破坏,我当然可以做到:
myFunction(options?: {opt1?: boolean, opt2?: boolean}) {
  const opt1 = options.opt1;
  const opt2 = options.opt1;
  ...

看起来这些应该是同一回事,但是不允许使用最高示例。

我想使用一种经过分解的语法(1),因为它存在并且是一种不错的语法,上述两个函数的行为似乎自然而然,以及(2),因为我也想要一种简洁的方法来指定默认值:
myFunction({opt1, opt2 = true}?: {opt1?: boolean, opt2?: boolean})

在不进行解构的情况下,我必须将这些默认值埋在函数的实现中,或者使用一个实际上是带有构造函数的类的参数...

最佳答案

请改用默认参数:

function myFunction({ opt1, opt2 = true }: { opt1?: boolean; opt2?: boolean; } = {}) {
    console.log(opt2);
}

myFunction(); // outputs: true

为了不破坏undefined是必要的:

function myFunction({ opt1, opt2 }) {
}

// Uncaught TypeError: Cannot destructure property `opt1` of 'undefined' or 'null'.
myFunction();

09-25 18:56