任何人都可以解释这个TypeScript片段吗?

时间:2015-11-05 18:54:30

标签: typescript

接口用作合同的蓝图。 然而在TypeScript中你有这种奇怪的语法(基本上有一个新的() 接口)。这是某种工厂吗?

interface IControllerDetails {
     controller : { new(...args:string[]): void ;};
}

用于阅读。

3 个答案:

答案 0 :(得分:3)

这意味着符合接口的对象的controller属性具有构造函数,构造函数可以使用任意数量的字符串参数。

所以你可以编写如下代码:

let controllerDetails: IControllerDetails = ...;

let controller = new controllerDetails.controller("any", "amount", "of string args");

奇怪的是,在创建控制器属性的新实例时,它返回void。因此,在显示的代码中,controller的类型为void。我不确定为什么有人会这样做,除非只是打电话给new controllerDetails.controller()做了所有必要的事情,但即使这仍然很奇怪。

符合接口的值的示例如下:

class Controller {
    constructor(...args: string[]) {
    }
}

let controllerDetails: IControllerDetails = {
    // you could inline a class here if you wanted by using a class expression
    controller: Controller
};

编辑:通过“内联”,我只是想你可以写这个,如果你想要的,这是不常见的:

let controllerDetails: IControllerDetails = {
    controller: class Controller {
        constructor(...args: string[]) {
        }
    }
};

答案 1 :(得分:3)

要解决这个问题:

interface IControllerDetails {
     controller : { new(...args:string[]): void ;};
}

让我们从这里开始

interface IControllerDetails {

这声明了一个名为IControllerDetails

的类型
     controller : { new(...args:string[]): void ;};
     ~~~~~~~~~~

它有一个名为controller

的属性
     controller : { new(...args:string[]): void ;};
                  ~                              ~

controller属性的类型是具有某些成员的对象类型。可能在{}之间声明了更多属性,但这里只有一个属性

     controller : { new(...args:string[]): void ;};
                    ~~~

controller属性的唯一成员是构造签名。这意味着您可以在new属性上调用controller运算符。

     controller : { new(...args:string[]): void ;};
                        ~~~           ~~

此构造函数介于零和无穷大之间。

     controller : { new(...args:string[]): void ;};
                           ~~~~

参数列表的名称为args,但这不会影响任何内容。

     controller : { new(...args:string[]): void ;};
                                ~~~~~~

所有参数都必须是string

类型
     controller : { new(...args:string[]): void ;};
                                           ~~~~

构造函数不必返回任何内容。在实践中,他们在这里所说的是你可以返回任何类型的对象(因为可以安全地为返回 less 的函数返回 more 的函数)。

答案 2 :(得分:0)

基本上,someMember : { new(...args:string[]): IAnotherSample ;};的语法意味着Class必须具有与接口契约匹配的相同构造函数签名。对于任何需要完整资源的人来说,你去:

```

interface ISample {
    // someMember requires a class with a constructor that has matching signature and return type
    someMember : { new(...args:string[]): IAnotherSample ;};
}
interface IAnotherSample {
    someNum: number;
}
class MyClass implements IAnotherSample{
    public someNum:number;
    constructor(...args:string[]) {
    }
}

let sample: ISample = {
    someMember: MyClass
};

let sampleInstance = new sample.someMember('123');

```