在我的一个ts模块中,我定义了一个接口,其中一个类实现了它(为简洁而清理):
export interface Encoder {
name: string;
exec: (str: string, origParam?: string | null) => string;
}
class NOPEncoder implements Encoder {
public name: "None";
public exec(str: string, origParam?: string | null): string {
// origParam is not important in this case, this method is designed as a no-op
return str;
}
}
但是,尝试创建Map<string, Encoder>
会给我一些问题。我已经尝试了这两种构造所述类型值的方法:
// Method 1
const encoders = new Map<string, Encoder>();
encoders.set("NOP", NOPEncoder);
// Method 2
const encoders = new Map<string, Encoder> ([
["NOP", <Encoder>NOPEncoder],
]);
方法1和方法2都给出了类似"Type 'typeof NOPEncoder' cannot be converted to type 'Encoder'. Property 'exec' is missing in type 'typeof NOPEncoder'."
的错误但是,NOPEncoder
类显式实现了Encoder
接口(并且编译器对此很好),并且它清楚了有一个exec
方法。我在这做错了什么,以至于编译器不接受NOPEncoder
可强制转换为Encoder
实例?
答案 0 :(得分:1)
NOPEncoder
是一个班级。您将Map
定义为Encoder
的实例;即,类NOPEncoder
不是Encoder
的实例,它是一种扩展Encoder
的类型。这应该有效:
const encoders = new Map<string, Encoder>();
encoders.set("NOP", NOPEncoder());
如果要存储实际的类引用,我目前还不知道在TypeScript中执行此操作的方法。如果有人知道的话,我会非常有兴趣了解这种方法!
编辑添加:@jcalz有一个足够接近的方法来存储类型构造函数的签名,如Map<string, new (...args: any[]) => Encoder>
。整洁的技巧,我必须在某个时候玩它!