TypeScript方法签名

方法签名是声明函数类型的属性成员的简写。方法签名的语法如下所示:

PropertyName(ParameterList): Type

PropertyName表示对象属性名,可以为标识符、字符串、数字和可计算属性名;ParameterList表示可选的方法形式参数列表类型;Type表示可选的方法返回值类型。从语法的角度来看,方法签名是在调用签名之前添加一个属性名作为方法名。

下例中定义了Document接口,它包含一个方法签名类型成员。该方法的方法名为getElementById,它接受一个string类型的参数并返回“HTMLElement | null”类型的值。

interface Document {
   getElementById(elementId: string): HTMLElement | null;
}

之所以说方法签名是声明函数类型的属性成员的简写,是因为方法签名可以改写为具有同等效果但语法稍显复杂的属性签名。我们知道方法签名的语法如下所示:

PropertyName(ParameterList): Type

将上述方法签名改写为具有同等效果的属性签名,如下所示:

PropertyName: { (ParameterList): Type }

在改写后的语法中,属性名保持不变并使用对象类型字面量和调用签名来表示函数类型。由于该对象类型字面量中仅包含一个调用签名,因此也可以使用函数类型字面量来代替对象类型字面量。示例如下:

PropertyName: (ParameterList) => Type

下面我们通过一个真实的例子来演示这三种可以互换的接口定义方式:

interface A {
   f(x: boolean): string;       // 方法签名
}

interface B {
   f: { (x: boolean): string }; // 属性签名和对象类型字面量
}

interface C {
   f: (x: boolean) => string;   // 属性签名和函数类型字面量
}

此例中我们定义了三个接口A、B和C,它们都表示同一种类型,即定义了方法f的对象类型,方法f接受一个boolean类型的参数并返回string类型的值。

方法签名中的属性名可以为可计算属性名,这一点与属性签名中属性名的规则是相同的。示例如下:

const f = 'f';

interface A {
   [f](x: boolean): string;
}

若接口中包含多个名字相同但参数列表不同的方法签名成员,则表示该方法是重载方法。例如,下例中的方法f是一个重载方法,它具有三种调用签名:

interface A {
   f(): number;
   f(x: boolean): boolean;
   f(x: string, y: string): string;
}

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!