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



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

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

我的理解: name应该是一个字符串参数,而不是强制性的

我不明白的是:any之外是如何工作的?new name是什么意思?

来源:OutputDecorator的Angular核心文档:

分别是呼叫签名构造签名

任何你定义的类型为MyInterface的都可以是

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

在这两种情况下,调用new或调用MyInterface都会得到类型为any的值。


对于这个:

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

根据TypeScript规范,调用或构造签名只能出现在TypeBody中,类型主体只能在对象类型文字和接口声明中使用。这与ClassBody不允许调用/构造签名有微妙的不同。

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

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

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

请注意,使用调用和构造签名实现某些东西意味着实例将获得类型,而不是静态端。换句话说,你说MyClass产生的东西将与MyInterface兼容,但没有提到MyClass本身的静态形状。

现在没有办法确保静态侧具有特定的形状,除非像这样的hack:

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

最新更新