当前位置: 首页 > Web前端 > HTML

Whatistheconstructorsignatureininterface

时间:2023-03-28 01:27:27 HTML

接口中的构造函数签名不能在类中实现;它们仅用于定义定义可更新的现有JSAPI。下面是一个例子:interfaceComesFromString{name:string;}表示这个接口代表一个可以使用`new`运算符操作的对象。返回的类型是ComesFromStringinterfaceStringConstructable{new(n:string):ComesFromString;}classMadeFromStringimplementsComesFromString{constructor(publicname:string){console.log('ctorinvoked');}}//下面的函数定义了一个工厂方法。工厂方法的输入是之前定义的构造函数签名functionmakeObj(n:StringConstructable){returnnewn('hello!');}console.log(makeObj(MadeFromString).name);执行结果:上面的例子其实是makeObj函数调用创建了一个约束,传入的入参必须被new操作应用,构造函数只包含一个入参,类型为string。以下代码会导致编译错误:classOtherimplementsComesFromString{constructor(publicname:string,count:number){}}makeObj(Other);“typeofOther”类型的参数不可分配给“StringConstructable”类型的参数。(2345)添加问号将其设置为可选参数后,问题消失:具有构造签名接口不打算实现通过任何类(乍一看,这对于一些具有C#/Java背景的开发人员来说可能看起来很奇怪,但这确实是一种不同的设计思想)。暂时把它想象成一个带有调用签名的接口(就像Java世界中的@FunctionalInterface)。它的目的是描述一个函数类型。函数对象应满足所描述的签名。但不仅仅是任何高级函数或方法。它应该是一个知道如何构造对象的函数,一个在使用new关键字时被调用的函数。因此,具有构造签名的接口定义了构造函数的签名。如我上面给出的例子,makeObj函数只接受构造函数只包含一个输入参数且数据类型为string。示例:interfaceClassicInterface{//类似于C#/Java中的老式接口method1():string;methodN():string;}interfaceFactory{//知道如何构造对象//注意:注意返回类型new(myNumberParam:number,myStringParam:string):ClassicInterface}classMyImplementationimplementsClassicInterface{//构造函数看起来像Factoryconstructor(num:number,s:string){console.log('inmyImplementation:',num,s);中描述的签名}//显然返回了ClassicInterfacemethod1()的一个实例{return'1';}methodN(){返回'2';}}classMyOtherImplementationimplementsClassicInterface{//构造函数看起来像工厂构造函数中描述的签名(n:数字,s:字符串){console.log('inmyOtherImplementation:',n,s);}//显然返回了一个ClassicInterface的实例方法1(){返回'3';}methodN(){返回'4';}}//constructionfunctioninstantiateClassicInterface(ctor:Factory,myNumberParam:number,myStringParam:string):ClassicInterface{returnnewctor(myNumberParam,myStringParam);}//这就是我们的做法letiWantTheFirstImpl=instantiateClassicInterface(MyImplementation,3.14,"smile");letiWantTheSecondImpl=instantiateClassicInterface(MyOtherImplementation,42,"vafli");console.log('done');输出: