如何编写可选的类型化立即分解参数?
举个例子,我希望下面的函数可以在不提供任何参数的情况下被调用。
const foo = ({bar}: {bar?: boolean}) => {};
现在,TypeScript抱怨缺少参数。
答案 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
对我很好。希望能有所帮助;祝你好运!
答案 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也不允许它们。