【问题标题】:How to ensure that argument type of Class implements an interface如何确保类的参数类型实现接口
【发布时间】:2018-11-05 17:07:38
【问题描述】:

我有一个实现接口IField的类

export class FieldImplementation implements IField { };

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

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

我需要确保传递给addField 的参数实现IField

目前addField 看起来像这样:

addField(field: any) {
...
}

【问题讨论】:

  • 您希望参数是生成IField 对象的类构造函数吗?那将是addField(field: new(...args: any[])=>IField)。您对该构造函数的参数数量有限制吗?
  • “我仍然可以传递其他不实现 IField 的类”。请给我们看看。我认为IField 是空的(这是一个关于structural typing 变相的问题)或者其他事情正在发生。我认为无论哪种方式,我们都需要查看更多代码。
  • “只能传递一个参数”什么类型的参数?如果不清楚,我会询问 constructor() 内的任何 classimplements IField 的参数。
  • @jcalz 其实我很抱歉。它确实有效。如果您创建一个答案,我会接受它。谢谢

标签: typescript


【解决方案1】:

您正在寻找构造函数签名,也称为a "newable" type。您希望addField() 的参数成为您调用new 以获得IFIeld 的东西。可以这样表示:

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

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


如果您希望使用 new 和特定数量和类型的参数调用 field,您也可以表达这一点。例如,如果您希望 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();

希望对您有所帮助。祝你好运!

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-09-07
    相关资源
    最近更新 更多