首页 > 解决方案 > 如何确保类的参数类型实现接口

问题描述

我有一个实现接口的类IField

export class FieldImplementation implements IField { };

还有一个存储类型的服务:

import { FieldImplementation } from '../component';
...
service.addField(FieldImplementation);

我需要确保传递给addFieldimplements的参数IField

目前addField看起来像这样:

addField(field: any) {
...
}

标签: typescript

解决方案


您正在寻找构造函数签名,也称为“可更新”类型。您希望参数addField()成为您调用new以获取IFIeld. 可以这样表示:

addField(field: new(...args: any[])=>IField) {
  // ...
  new field(/* some kind of arguments */);
}

该签名将接受任何生成 的构造函数IField,但可能与构造函数接受的参数不匹配。


如果您期望field使用new特定数量和类型的参数调用,您也可以表达这一点。例如,如果你想field成为一个无参数的构造函数:

addField(field: new()=>IField) {
  // ...
  new field(); // no arguments
}

然后,如果FieldImplementation是一个具有无参数构造函数的类,它将成功:

service.addField(FieldImplementation); // okay

而需要构造函数参数的类将失败,这很好:

class NeedAString implements IField { 
  constructor(private myString: string) { }
};
service.addField(NeedAString); // error, NeedAString is not a no-arg constructor
// error is desirable because you don't want addField() implementation
// to call new NeedAString();

希望有帮助。祝你好运!


推荐阅读