接口用作合同的蓝图。 然而在TypeScript中你有这种奇怪的语法(基本上有一个新的() 接口)。这是某种工厂吗?
interface IControllerDetails {
controller : { new(...args:string[]): void ;};
}
用于阅读。
答案 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');
```