TypeScript“Function”类型与声明方法签名

时间:2017-03-13 23:12:44

标签: typescript typescript2.0

我对TypeScript还很陌生,所以其他SO问题和文档有时让我感到困惑,就像我开始时一样。我将尽可能简单地说明这一点,如果它是重复的,请指出我。

我基本上想知道创建类型Function的成员与简单地在类中定义方法签名之间的区别。请考虑以下示例:

export abstract class MyBase {
    protected abstract method1();
    protected abstract method2(): void;
    protected abstract method3: Function;
}

我的理解是1和2之间的区别在于1的返回类型为any,而2有void或其中指定的任何类型。

我不太确定1和3之间的区别是什么。有吗?

最后,我想知道,鉴于1和2之间的关系,为什么不允许函数类型是通用的?换句话说,似乎我们可以拥有这个(但我们不能):

protected abstract method4: Function<void>;

2 个答案:

答案 0 :(得分:2)

  

我不太确定1和3之间的区别是什么。

一个很大的不同:

declare function method1(); // () => any
declare const method3: Function; // ALL Functions

仅基于参数数量:

method1(123); // Error 
method3(123); // Okay
  

鉴于1和2之间的关系,为什么不允许函数类型是通用的?

它与C#不同。 Function类型命名为本机JavaScript函数。

答案 1 :(得分:1)

类中这些方法之间的差异

  1. 返回类型 - 它们的返回类型不同; method1&amp; method3的返回类型为any,但methods2的返回类型为void。您可以使用tsc --declaration输出.d.ts并查看声明文件,如下所示:

    export declare abstract class MyBase {
      protected abstract method1(): any;
      protected abstract method2(): void;
      protected abstract method3: Function;
    }
    
  2. 动态与静态方法 - method1&amp;可以通过method2枚举prototype,但method3不能,因为它是属性,而不是方法。此外,它永远不能添加到Superclass.prototype中。在Superclass的构造函数中,仅使用method3分配this.method3=()=>{},因此枚举为properties的动态方法和Subclasses也在Superclass中继承其动态方法,但不能使用{{ 1}}。如果这样做,TypeScript编译器将报告错误,如果您调用它将引发运行时错误。以下是我所说的测试。

  3.   

    建议:您应该使用静态技术声明方法,而不是super使用的动态技术。如果使用动态技术,则不能重用超类方法。

    method3