如何正确输入实现接口的类?
示例代码:
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[]'.
*/
我应该怎么做?
答案 0 :(得分:3)
创建一个接口,描述将实例化实现IPlugin
的对象的对象。您可以使用新签名来执行此操作:
interface IPluginConstructor {
new(...args: any[]): IPlugin;
}
现在将arrayOfClass
键入为IPluginConstructor
s:
const arrayOfClass: IPluginConstructor[] = [SomePlugin];
请注意类型中的[]
。这个问题不存在。
<强>旁注强>
如果仔细观察,name
中any
的类型为SomePlugin
...已将其设置为any
,因为该类型是隐式输入的any
和string
可分配给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
编译器标志,以帮助将来发现这类错误。