我试图在 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/