您可以在Typescript函数中使用可选的分解结构参数吗?

Sam*_*Fen 5 typescript

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

myFunction({opt1, opt2}?: {opt1?: boolean, opt2?: boolean})
Run Code Online (Sandbox Code Playgroud)

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

如果不进行破坏,我当然可以做到:

myFunction(options?: {opt1?: boolean, opt2?: boolean}) {
  const opt1 = options.opt1;
  const opt2 = options.opt1;
  ...
Run Code Online (Sandbox Code Playgroud)

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

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

myFunction({opt1, opt2 = true}?: {opt1?: boolean, opt2?: boolean})
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ret 16

请改用默认参数:

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

myFunction(); // outputs: true
Run Code Online (Sandbox Code Playgroud)

为了不破坏结构,这是必要的undefined

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

myFunction(); // outputs: true
Run Code Online (Sandbox Code Playgroud)

  • @icl7126 不幸的是没有。通常在这些情况下我会将内联类型提取到接口,因为它太冗长了:( (5认同)
  • 有没有办法避免参数对象中重复“opt1”和“opt2”?类似“function myFunction({ opt1?: boolean; opt2?: boolean = false; } = {})”之类的东西。 (2认同)

Wil*_*een 12

如果没有作为参数给出的对象,则无法解构。因此,如前一篇文章所述,在 parmas 中使用默认对象:

type Options = { opt1?: boolean; opt2?: boolean; }

function myFunction({ opt1, opt2 }: Options = {}) {
    console.log(opt2, opt1);
}

myFunction() // undefined,  undefined 
myFunction({opt1: false}); // undefined,  false 
myFunction({opt2: true}); // true,  undefined
Run Code Online (Sandbox Code Playgroud)

我想补充的是,当满足以下两个条件时,参数中的这种解构模式会增加最大的价值:

  • 选项的数量可能会改变
  • 该函数的 API 可能会发生变化。即函数参数可能会改变

基本上,解构为您提供了更大的灵活性,因为您可以添加任意数量的选项,而对函数 API 的更改最少。

然而,更基本的版本会更简单:

// If the function is not likely to change often just keep it basic:
function myFunctionBasic( opt1? :boolean, opt2?: boolean ) {
    console.log(opt2, opt1);
}
Run Code Online (Sandbox Code Playgroud)