【发布时间】:2018-01-06 01:58:47
【问题描述】:
有没有办法检查某物是否是没有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,我会得到一个循环依赖循环。如果我不需要它,我会收到一个错误:
找不到名称“模型”
那么有没有办法我可以在 Base 类中做 instanceof ?
有两种使用方式:
new Base().firstOrFail()
或
new Model().firstOrFail()
【问题讨论】:
-
导入模型。它就在文件模型中
-
在那里使用
instanceof Model的目的是什么?为什么需要它? -
因为
Base也需要访问firstOrFail方法。首先将返回一个Row | Model的实例,如果Model的内部数组的长度为零,它应该抛出一个错误,也就是“失败”。但是行,没有内部数组,所以不需要在那里检查 -
目前我正在使用
if ('length' in val && val.length == 0)这在 JavaScript 中有效,但打字稿抱怨它。Property 'length' does not exist on type 'this | Row<I>'(这是模型)这是一个错误顺便说一句:github.com/Microsoft/TypeScript/issues/20893 -
因此,基类需要了解派生类的任何信息通常被认为是不好的形式。这里更好的答案是修复你的逻辑和结构,这样就根本不需要发生。
标签: javascript node.js typescript