我有一个带有单个参数的函数,我将其称为options
。我更喜欢不使用options
样式(我更喜欢命名参数),但这是目前的要求。每个TypeScript docs
options
对象内部项目的类型。
const doThing = async ({
query = null
}: {
query?: string;
}) => {
var options = Array.from(arguments)[0]
};
此操作失败:
Cannot find name 'arguments'.ts(2304)
我不明白这一点,因为arguments
应该存在于所有JS函数中。
如何在Typescript函数中使用arguments
?
只有一个options
参数
强制输入并在其中的数据上使用默认值
能够通过名称访问该options
参数。
答案 0 :(得分:1)
正如注释中已经指出的那样,箭头函数没有保留的arguments
变量。
但是如果您只是将这些要求分解为不同的语句,则仍然可以具有类型安全性,单个命名参数和默认值。这也将使代码更易于阅读和理解:
interface Options {
query: string | null;
}
const defaultOptions: Options = {
query: null,
}
const doThing = async (options: Partial<Options>) => {
const completeOptions: Options = Object.assign({}, defaultOptions, options);
};
此外,Options
接口实际上以这种方式指定了函数体内需要的结构。
现在,您还可以传递部分选项,而不必在字面上直接两次内联地指定所有属性,其中签名的值级别({ query = null }
-之前指定了默认值,而类型级别- -{ query?: string; }
-分别指定了两种类型以及选项键是可选的。现在,可选部分改为使用Partial
类型。
答案 1 :(得分:0)
我认为您正在寻找的东西可以通过使用函数的重载来实现。这将允许:
所以您的函数重载看起来像这样:
function doThingFunc(arg: { query: string, somthingElse?: string }): void;
function doThingFunc(arg: string): void
function doThingFunc(arg: any): void {
if (typeof arg === 'object') {
console.log(arg.query);
}
if (typeof arg === 'string') {
console.log(arg);
}
}
const doThing = doThingFunc;
doThing('some query');
doThing({ query: 'some query', somthingElse: 'something else' });
当然,通过此实现,当在箭头功能提供的现成对象中使用时,您会丢失 this 绑定。此处有更多详细信息: https://www.typescriptlang.org/docs/handbook/functions.html