Typescript - 即使定义了属性,实现接口的类型也缺少属性

时间:2017-08-09 22:23:38

标签: typescript

在我的一个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实例?

1 个答案:

答案 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>。整洁的技巧,我必须在某个时候玩它!