如何在TypeScript函数中访问“参数”?

时间:2020-03-04 17:18:12

标签: typescript

我有一个带有单个参数的函数,我将其称为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参数。

2 个答案:

答案 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)

我认为您正在寻找的东西可以通过使用函数的重载来实现。这将允许:

  1. 具有一个带有单个参数的函数。
  2. 通知类型系统不同的类型。
  3. 根据收到的类型更改功能行为。 (这违反了单一责任的OOP原则,但让我们回到您的问题...)

所以您的函数重载看起来像这样:

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