Typescript参数:字符串参数末尾的任何参数

时间:2016-11-18 17:18:55

标签: angular typescript interface

所以,我正在学习打字稿,但我不明白这些参数是如何工作的

interface MyInterface {
   (name?: string): any;
   new (name?: string): any;
}

class MyClass implements MyInterface {
    (name?: string): any; // This is not working
}

我的理解: name应该是字符串参数,不是必需的

我不理解的内容:{y} any如何运作? new name是什么意思?

来源:Angular core documentation for OutputDecorator

1 个答案:

答案 0 :(得分:0)

这些是呼叫签名构建签名

任何具有MyInterface类型的内容都可以是

  • 被调用,可选地带有string参数。
  • 构造(new - ed),可选地带有string参数。

在这两种情况下,调用或new一个MyInterface都会产生any类型的值。

至于此:

class MyClass implements MyInterface {
    (name?: string): any; // This is not working
}

调用或构造签名只能按照the TypeScript spec TypeBody 中进行。类型主体仅用于对象类型文字和interface declarations。这与 ClassBody 略有不同,后者不允许调用/构造签名。

在类中,您可以改为定义构造函数:

class C {
    constructor() {
        console.log("Hi");
    }
}

但是没有办法让一个类可以调用。

请注意,使用调用和构造签名实现某些操作意味着实例将获取类型,而不是静态端。换句话说,您说MyClass生成的内容与MyInterface兼容,但与MyClass本身的静态形状无关。

除了像这样的黑客之外,没有办法确保静态边具有某种形状:

class MyClass {
    // ...
}

if (!!false) {
    let x: MyInterface = MyClass;
}