【发布时间】:2021-02-13 18:14:42
【问题描述】:
在一个 Angular 项目中,我们有一个基类,从该基类派生了几个具体的类。在少数情况下,这些类以循环方式相互引用。
当这些文件在不同的类中时,项目编译成功但在浏览器中运行失败。
当所有类都放在一个 .ts 文件中时,一切正常,但我们有一个非常长且难以维护的文件。
有没有办法分离这些文件?即使是合并文件(以智能方式)的现有预编译任务也会受到赞赏。
编辑: 我熟悉导入、模块等。问题是循环依赖。它也不能通过更多的抽象来优雅地处理。我尝试添加一个最小的复制代码。
编辑: 这是一个复制,创建一个警告:它还显示了我开始循环依赖的原因。
base-class.ts:
import {StorageModel} from './storage-model';
import {SubClass1} from './sub-class-1';
export abstract class BaseClass {
children: BaseClass[];
abstract loadFromModel(model: StorageModel);
doSomething() {
if (this.children[0] instanceof SubClass1) {
(this.children[0] as SubClass1).action1();
}
}
}
sub-class-1.ts:
import {BaseClass} from './base-class';
import {StorageModel} from './storage-model';
import {SubClass2} from './sub-class-2';
export class SubClass1 extends BaseClass {
title: string = 'hello';
action1() {
}
loadFromModel(model: StorageModel) {
(this.children[0] as SubClass2).action2();
}
}
和类似的`sub-class-2.ts。 我在 angular cli 控制台中收到以下警告:
WARNING in Circular dependency detected:
src/models/sub-class-1.ts -> src/models/base-class.ts -> src/models/sub-class-1.ts
在浏览器控制台中:
[WDS] Warnings while compiling.
Circular dependency detected:
src/models/base-class.ts -> src/models/sub-class-1.ts -> src/models/base-class.ts
也就是说,代码正在运行。
我可以将 load fromModel 方法移动到访问者类(我实际上在项目中),但是我不会从重载和局部性中受益(加载逻辑在物理上接近所有相关代码)。
但是原始代码库会产生以下错误:
Uncaught TypeError: Object prototype may only be an Object or null: undefined
at setPrototypeOf (<anonymous>)
at __extends (navigation-list-filter-node.ts:7)
__extends 函数不是我的代码:
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype =
b.prototype, new __());
};
})();
【问题讨论】:
-
如果您需要多个模块中的组件,则需要一个额外的模块来声明和导出该组件,然后只需将该模块导入您需要该组件的任何位置。
-
是的,您可以将类分成单独的 .ts 文件。您只需要使用 export 关键字来导出类。您可以使用 import {yourclassname} from 'path' 导入您的课程
-
请发布重现您的特定问题的最小示例
-
你需要考虑你的结构/逻辑。如果基类依赖于继承它的类,继承就没有任何意义。继承的重点是基础不需要知道任何关于它的扩展或实现
-
在我看来,这些妥协从来没有必要,只需要更好的架构/数据建模。如果您期望进行大量维护,那么值得花时间正确地进行维护,如果您不这样做,从长远来看会伤害您。继承可能是一个有用的工具,但如果基础与实现紧密耦合,那么它是一个主要的危险信号,表明你做错了什么
标签: angular typescript