【问题标题】:Having trouble understanding call signatures无法理解呼叫签名
【发布时间】:2021-03-14 17:32:41
【问题描述】:

抱歉,如果这是一个有点愚蠢的问题。我听说过一些关于 Typescript 中的调用签名的信息,但我并不完全了解它们的作用。 Typescript 文档说:

在 JavaScript 中,函数除了可调用之外还可以具有属性。但是,函数类型表达式语法不允许声明属性。如果我们想用属性来描述可调用的东西,我们可以在对象类型中编写调用签名:

type DescribableFunction = {
  description: string;
  (someArg: number): boolean;
};
function doSomething(fn: DescribableFunction) {
  console.log(fn.description + " returned " + fn(6));
}

该文档没有提供任何关于您如何实际调用doSomething 的示例(也没有我在该主题上找到的几乎任何资源),我对“”的含义感到困惑可以用属性调用的东西”。 (someArg: number): boolean; 到底是什么意思?看起来它定义了一个返回类型为 boolean 的函数,它接受一个名为 someArg 的数字参数,但传入一个函数并没有做任何事情。那么……这到底是什么意思?同样,我研究了调用签名,但我发现的所有内容几乎都只是说“调用签名详细描述了函数”,这并不是很有帮助。 究竟是什么调用签名?

【问题讨论】:

  • 调用签名只是定义函数接受的参数(及其类型)和函数返回的类型。如果接口具有调用签名,则意味着它所描述的值必须是函数。如果一个函数实现了一个调用签名,这意味着它的参数和返回类型必须符合该调用签名。

标签: typescript


【解决方案1】:

DescribableFunction 中的 (someArg: number): boolean 表示任何要模仿 DescribableFunction 的函数必须:

  1. 有一个类型编号的参数
  2. 返回类型必须是布尔值

如果它满足这些条件,它现在可以使用 (object)DescribableFunction 属性。

为了能够扮演对象的角色,它必须定义对象的所有属性与相应的类型。从你的例子中

type DescribableFunction = {
  description: string;
  (someArg: number): boolean;
};
function doSomething(fn: DescribableFunction) {
  console.log(fn.description + " returned " + fn(6));
}

假设函数“callable”想充当对象,那么

const callable = (num) => {
    return num > 5;
}

从上面的代码可以看出,可调用函数满足前两个条件(即它有一个类型为 number 的参数和一个返回类型为 boolean 的参数)。接下来,它应该定义 DescribableFunction 的属性以及它们的正确类型。

callable.description = "Number is greater than 5";

现在,它已经满足了所有条件。接下来,让我们调用函数doSomething

doSomething(callable)

输出将是

Number is greater than 5 returned true

【讨论】:

    【解决方案2】:

    你将如何实际调用 doSomething

    这是一个函数,因此您可以像调用任何函数一样调用它(从doSomething 内部或从它外部):fn(6) 就是调用它的一个示例。

    我对“可通过属性调用的东西”的含义感到困惑

    函数是 JavaScript 中一种特殊的对象,任何对象都可以有任意键值对与之关联。通常看起来很奇怪,但有可能:

    const myFn = (someArg) => {
      return someArg > 5;
    };
    myFn.description = 'checks if arg is greater than 5';
    
    console.log(myFn(10));
    console.log(myFn.description);

    这是在纯 JavaScript 中。 TypeScript 的工作方式相同,只是您需要正确输入内容。

    究竟是什么 (someArg: number): boolean;意思是?看起来它正在定义一个返回类型为 boolean 的函数,该函数接受一个名为 someArg 的数字参数,

    完全正确。

    但是传入一个函数并没有做任何事情

    应该的。下面是 JS 中的一个例子:

    const myFn = (someArg) => {
      return someArg > 5;
    };
    myFn.description = 'checks if arg is greater than 5';
    
    
    function doSomething(fn) {
      console.log(fn.description + " returned " + fn(6));
    }
    
    
    doSomething(myFn);

    【讨论】:

    • 噢噢噢。我以为你应该传入一个描述参数一个函数,但实际上你只是应该传入一个函数。这更有意义。
    • 这个例子是在 JS 中,而不是在 TS 中,它并没有给定义 DescribableFunction 的类型安全方式带来太多的启发。事实上,如果你在 TS 中定义函数,它将无法转换,因为它缺少“描述”所需的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多