我对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>;
答案 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)
返回类型 - 它们的返回类型不同; 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;
}
动态与静态方法 - method1
&amp;可以通过method2
枚举prototype
,但method3
不能,因为它是属性,而不是方法。此外,它永远不能添加到Superclass.prototype
中。在Superclass的构造函数中,仅使用method3
分配this.method3=()=>{}
,因此枚举为properties
的动态方法和Subclasses也在Superclass中继承其动态方法,但不能使用{{ 1}}。如果这样做,TypeScript编译器将报告错误,如果您调用它将引发运行时错误。以下是我所说的测试。
建议:您应该使用静态技术声明方法,而不是
super
使用的动态技术。如果使用动态技术,则不能重用超类方法。
method3