有没有办法检查某个东西是否是一个没有importing
该对象的对象的实例?
我使用的类instanceof
是当前类的子类。我有一个运行函数的方法,并根据一些if语句返回Model
或Row
的新实例。 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()
答案 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
那样行走和嘎嘎。