absA.ts
import {B} from "./b"
import {C} from "./c"
export abstract class AbsA {
abstract test(): number
static list = [
new B(),
new C(),
]
static verify(value: number): boolean {
for(let data of AbsA.list) {
if (data.test() == value) {
return true
}
}
return false
}
}
b.ts
import {AbsA} from "./absA"
export class B extends AbsA {
test(): number {
return 88
}
}
c.ts
import {AbsA} from "./absA"
export class C extends AbsA {
test(): number {
return 4545
}
}
调用
import {AbsA} from "./absA"
const result = AbsA.verify(23234)
报错:
Uncaught (in promise) Error: TypeError: Super expression must either be null or a function
at _callee$ (index.js?9de7:400:1)
at tryCatch (runtime.js?96cf:63:1)
at Generator.invoke [as _invoke] (runtime.js?96cf:294:1)
at Generator.eval [as throw] (runtime.js?96cf:119:1)
at asyncGeneratorStep (asyncToGenerator.js?c973:3:1)
at _throw (asyncToGenerator.js?c973:29:1)
不怎么懂ts,这样怎么改?
初始化
AbsA
的时候需要B
和C
。而初始化B
和C
的时候又需要AbsA
…… 这造成了循环引用。考虑到正常的设计过程,肯定是先有
AbsA
再有它的子类。而写AbsA
的时候并不知道有B
和C
这两个子类。所以在AbsA
中不应该引用B
和C
。然后AbsA.list
初始化,这个初始化过程一定是在B
和C
已经定义之后,要把这个初始化过程后置,一个是在完成子类定义之后修改AbsA.list
的值,另一个是直接从AbsA.ts
中导出一个初始化函数,用来在后面初始化。那么,大概应该这样
AbsA.ts
中定义AbsA
,将AbsA.list
初始化为[]
。在AbsA.ts
中导出一个初始化函数,用来初始化AbsA.list
(由于 JS 的属性开放性,不需要这个初始化函数也可以);b.ts
和c.ts
,这时候是可以随便使用AbsA.ts
的,因为那里面没有反过来引用;absa
目录中;absa
外面放一个AbsA.ts
,这里进行初始化并导出AbsA
、B
和C
然后外面都使用外层这个
AbsA.ts
就好了