childof child导致循环依赖

时间:2018-01-06 01:58:48

标签: javascript node.js typescript

有没有办法检查某个东西是否是一个没有importing该对象的对象的实例?

我使用的类instanceof是当前类的子类。我有一个运行函数的方法,并根据一些if语句返回ModelRow的新实例。 Model扩展了具有我使用instanceof的方法的类,我想检查它是否是Model的实例,然后执行一些其他操作。

export class Base {
    public firstOrFail() {
        let val = this.first() // Returns a new instance of Model or Row
        if(val instanceof Model && val.length == 0) {
            throw new Error('No values')
        }
    }
}

然后我有两个文件,每个看起来像这样:

// File Model.ts
import { Base } from './Base'
export class Model extends Base {}

// File Row.ts
export class Row {}

我遇到的问题是如果我在base中导入Model我得到一个循环依赖循环。如果我不需要它,我会收到错误:

  

找不到名称'Model'

那么我可以在instanceof课程中Base进行操作吗?

有两种方法可以使用:

new Base().firstOrFail()

new Model().firstOrFail()

2 个答案:

答案 0 :(得分:3)

  

那么有没有办法在Base类中做instanceof?

除非您将它们放在同一个文件中,否则不容易。 TRUE要求在您使用之前定义您要测试的对象。您可以使用一些可以将它们保存在单独文件中的黑客,因为在定义instanceof对象时,您实际上不需要引用Model类(&#39} ;仅在实例化Base对象时才需要,但我建议修改设计而不是追求设计。

对于基类来说,它通常被认为是错误的OO形式,需要知道有关派生类的任何信息。任何特定于派生类的行为都应该在派生类中实现,并且基类总是能够让派生类执行他们需要使用适当设计所做的事情。在OO设计的20年中,我从来没有找到基类必须知道派生类的任何合法理由。

因此,更好的答案将修复您的逻辑和结构,以便您的Base类不需要了解Base类的任何内容。

您可以使用的一个实现方法是覆盖Model类中的Model。你可以将它转换为打字稿,但这就是它在普通ol' ES6:

firstOrFail()

答案 1 :(得分:0)

简短的回答是" no" - 您不能将instanceof与未定义的操作数一起使用。

但是,这并不一定意味着您无法发现对象是否是该类的实例。

instanceof查看原型链。你可以手动做同样的事情。那可能需要你使用一些鸭子类型来确定原型是否像Model那样行走和嘎嘎。