【发布时间】:2017-09-28 01:25:31
【问题描述】:
我有一个抽象类FooObject。只有两个孩子继承了FooObject,我们称他们为ThisFooObject 和ThatFooObject。
我正在寻找一种 高效 方法来将 FooObject 转换为它的任何子对象。在这种情况下,这意味着不使用 instanceof - performs 以
我调查的方式是这样的:
FooObject.ts
import ThisObject from "./ThisObject";
import ThatObject from "./ThatObject";
abstract class FooObject {
isThisObject() : this is ThisFooObject {
// Either check for ThisFooObject properties, or override this
// in the ThisFooObject class to always return true.
return duckTypingTest();
}
// ditto here
isThatObject() : this is ThatFooObject {}
}
我知道这不漂亮。如果我有更多 FooObject 的孩子,这不是一种可扩展的方法——它需要父母以一种打破封装的方式了解孩子。但在我的具体情况下,如果它避免我不得不做'instanceof',我愿意忍受这个。
从好的方面来说,当我有一个 FooObject 的引用,并且当它是一个 ThatFooObject 时我想要一些东西时,我可以执行以下操作:
fooObjects.forEach( foo => {
// Foo currently typed as a FooObject
if(foo.isThatObject()){
// Foo now typed as a ThatFooObject
foo.magic+=10
}
});
这一切都有效 - 有一点需要注意 - 我必须 be careful 才能使导入顺序正确。 IE,在我的main.ts 入口点,做类似的事情
import 'ThatFooObject';
import 'FooObject';
但除此之外,我对这种模式相当满意。当我对多个孩子进行尝试时,问题就来了。我开始遇到循环依赖项的问题,以及像class extends value undefined is not a constructor or null 这样的错误。
我不知道如何进行这项工作。我是不是找错了树,我应该用更简单的方法来做这件事吗?
【问题讨论】:
-
如果您从进口订单中收到类似的错误,那么您的装载机不符合规范。
-
无法重现此问题,无论我以何种顺序导入三个文件,始终以正确的顺序导入。也许您可以提供一个导致循环依赖或错误导入顺序的完整示例?一种丑陋的解决方案(对于您实际遇到的任何问题)可能是将导入语句移动到 FooObject.ts 的底部,以强制在创建 FooObject 类之后导入这些其他文件。
标签: typescript inheritance types parent-child instanceof