类构造函数和接口

时间:2017-04-14 22:54:13

标签: class typescript interface

如何正确输入实现接口的类?

示例代码:

interface IPlugin{
  name:string;
}

class SomePlugin implements IPlugin{
  name;
  constructor(){
    this.name = 'Sam';
  }
}

const arrayOfClass:IPlugin = [SomePlugin];
// Ther error :
/*
Type 'typeof SomePlugin[]' is not assignable to type 'IPlugin'.
  Property 'name' is missing in type 'typeof SomePlugin[]'.
*/

我应该怎么做?

1 个答案:

答案 0 :(得分:3)

创建一个接口,描述将实例化实现IPlugin的对象的对象。您可以使用新签名来执行此操作:

interface IPluginConstructor {
    new(...args: any[]): IPlugin;
}

现在将arrayOfClass键入为IPluginConstructor s:

的数组
const arrayOfClass: IPluginConstructor[] = [SomePlugin];

请注意类型中的[]。这个问题不存在。

<强>旁注

如果仔细观察,nameany的类型为SomePlugin ...已将其设置为any,因为该类型是隐式输入的anystring可分配给any。这意味着以下代码编译:

const s = new SomePlugin();
const num: number = s.name; // this compiles... sad! :(

您应该明确键入...

class SomePlugin implements IPlugin {
  name: string;
  constructor() {
    this.name = 'Sam';
  }
}

......或隐含地......

class SomePlugin implements IPlugin {
  name = 'Sam';
}

我建议你启用noImplicitAny编译器标志,以帮助将来发现这类错误。