构造签名的用法与调用签名类似。若在对象类型中定义了构造签名类型成员,那么我们称该对象类型为构造函数类型。构造签名的语法如下所示:
{
new (ParameterList): Type
}
在该语法中,new
是运算符关键字,ParameterList
表示构造函数形式参数列表类型,Type
表示构造函数返回值类型,两者都是可选的。
下例中,我们使用对象类型字面量和构造签名定义了一个构造函数类型,该构造函数接受一个string类型的参数,并返回新创建的对象:
let Dog: { new (name: string): object };
Dog = class {
private name: string;
constructor(name: string) {
this.name = name;
}
};
let dog = new Dog('coolcou');
此例中,Dog
的类型为构造函数类型,它接受一个string类型的参数并返回object类型的值。
构造函数类型字面量完全等同于仅包含一个类型成员并且是构造签名类型成员的对象类型字面量。换句话说,构造函数类型字面量是仅包含单个构造签名的对象类型字面量的简写形式,如下所示:
{ new ( ParameterList ): Type }
// 简写为:
new ( ParameterList ) => Type
调用签名与构造签名
有一些函数被设计为既可以作为普通函数使用,同时又可以作为构造函数来使用。例如,JavaScript内置的“Number()”
函数和“String()”
函数等都属于这类函数。示例如下:
const a: number = Number(1);
const b: Number = new Number(1);
若在对象类型中同时定义调用签名和构造签名,则能够表示既可以被直接调用,又可以作为构造函数使用的函数类型。示例如下:
{
new (x: number): Number; // <- 构造签名
(x: number): number; // <- 调用签名
}
此例中,对象类型字面量定义了一个构造签名“new (x: number): Number;”
,它接受一个number类型的参数,并返回Number类型的值。同时,该对象类型字面量还定义了一个调用签名“(x: number): number;”
,它接受一个number类型的参数,并返回number类型的值。示例如下:
declare const F: {
new (x: number): Number; // <- 构造签名
(x: number): number; // <- 调用签名
};
// 作为普通函数调用
const a: number = F(1);
// 作为构造函数调用
const b: Number = new F(1);
此例中,函数F
的类型既是函数类型又是构造函数类型。因此,允许直接调用F
函数,或者以构造函数的方式调用F
函数。
酷客网相关文章:
评论前必须登录!
注册