javascript - TypeScript 工厂模式表示属性不存在

标签 javascript inheritance typescript abstract-class factory-pattern

我试图在 TypeScript 中实现工厂模式,但我无法访问父类(super class)中不存在的子函数。 (它有效,但编译器给我一个错误)。

结构:

abstract class Animal {
    walk(meters:number) { ... }
}

class Elephant extends Animal {
    walk(meters:number) { ... }
}

class Eagle extends Animal {
    walk(meters:number) { ... }
    fly(meters:number) { ... }
}

我的工厂:

class Zoo {
    animals:Animal[] = [];

    addAnimal(type:string): Animal {
        var a: Animal;

        switch(type) {
            case 'elephant':
                a = new Elephant();
                break;
            case 'eagle':
                a = new Eagle();
                break;
            default:
                throw new Error('Animal of type \'' + type + '\' doesn\t exist');
        }

        this.animals.push(a);
        return a;
    }
}

然后:

var sammy:Animal = addAnimal('eagle');
sammy.fly(15);

这给了我: 错误:TS2339:“动物”类型上不存在属性“飞行”。

我也尝试转换:

var sammy:Eagle = addAnimal('eagle');
sammy.fly(15)

这给了我: 错误:TS2322:类型“动物”无法分配给类型“鹰”。 “动物”类型中缺少属性“fly”。

我在 TypeScript 页面上创建了一个代码 Playground :http://bit.ly/21yXXjf

最佳答案

快速修复

您可以使用类型断言将类型检查从 TypeScript 中移交给您自己。

var sammy = <Eagle><any>zoo.addAnimal('eagle');
sammy.fly(15)

这可能会导致问题,因此有更好的解决方案来解决您的问题(以及一般的工厂问题)...

更好的解决方案

使用专门的签名根据静态字符串返回正确的类型:

class Zoo {
    animals:Animal[] = [];

    addAnimal(type: 'elephant'): Elephant;
    addAnimal(type: 'eagle'): Eagle;
    addAnimal(type: string): Animal;
    addAnimal(type: string): Animal {
        var a: Animal;

        switch(type) {
            case 'elephant':
                a = new Elephant();
                break;
            case 'eagle':
                a = new Eagle();
                break;
            default:
                throw new Error('Animal of type \'' + type + '\' doesn\t exist');
        }

        this.animals.push(a);
        return a;
    }
}

var zoo = new Zoo();

// No type assertion needed, sammy is an eagle!
var sammy = zoo.addAnimal('eagle');
sammy.fly(15)

关于javascript - TypeScript 工厂模式表示属性不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083201/

相关文章:

javascript - 使用 Typescript 捕获 Angular 中的点击事件?

javascript - 具有 3 列的 Google 图表

javascript - 自动设置 line-height 使顶部和底部没有间距

c# - 当属性隐藏具有 'new' 关键字的继承成员时,反射如何告诉我?

typescript - 我可以定义一个具有与每个值的键对应的值约束的 Typescript 映射吗?

Angular ,类型错误 : Cannot read property 'sort' of undefined

javascript - 如何使用 vanilla javascript 触发窗口调整大小事件?

Javascript 继承 codecademy

java - 没有getter方法就不能使用对象变量

java - 仅适用于特定类型的通用类