可选的类型化立即分解参数?

时间:2019-07-10 11:39:42

标签: typescript

如何编写可选的类型化立即分解参数?

举个例子,我希望下面的函数可以在不提供任何参数的情况下被调用。

const foo = ({bar}: {bar?: boolean}) => {};

现在,TypeScript抱怨缺少参数。

2 个答案:

答案 0 :(得分:3)

大概您对以下错误不满意:

const fooBad = ({ bar }?: { bar?: boolean }) => {}; // error!
// ┌──────────> ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
// A binding pattern parameter cannot be optional in an implementation signature.

这很有意义,因为您无法破坏undefined。在TypeScript中,您可以 使用default function parameter。在函数的调用端,这被视为可选参数(因此您可以将其省略),并且在实现端,它设置参数的值(如果为undefined

那么,如果有人打电话给foo(),您想破坏什么?我猜您希望bar成为undefined,对吗?因此,这意味着您要么传递类似{bar: undefined}的内容,要么(由于bar是可选的)传递空对象{}

const foo = ({ bar }: { bar?: boolean } = {}) => {
  console.log(bar);
};

我添加了console.log(bar),以便您在调用它时可以看到它的样子:

foo(); // undefined
foo({}); // undefined
foo({bar: true}); // true

对我很好。希望能有所帮助;祝你好运!

Link to code

答案 1 :(得分:2)

这是不可能的,仅仅是因为它在JavaScript中也不起作用。例如,使用这段JS:

const foo = ({bar}) => {
  ...
};

foo({ bar: 123 }); // works
foo(); // error

在没有对象参数的情况下调用foo会导致以下异常:

Uncaught TypeError: Cannot destructure property `bar` of 'undefined' or 'null'.

发生这种情况是因为上面的函数实现与编写几乎相同:

const foo = (arg1) => {
  let bar = arg1.bar;
};

foo();

这里的异常几乎相同,因为arg1.bar试图访问undefined对象上的属性。

长话短说,JavaScript在运行时不知道“可选”参数,因此TypeScript也不允许它们。