【发布时间】:2019-12-09 17:11:53
【问题描述】:
我有 2 个班级,A 级和 B 级。 B 类扩展了 A 类,以便我可以访问 A 类的实例和服务。B 类具有一些我将在 A 类中使用的功能。当我实现它时,出现了循环依赖错误,现在我收到一个浏览器错误消息:
“tslib.es6.js:25 Uncaught TypeError: Object prototype may only be an Object or null: undefined”。
import { BuyerCardComponent} from './buyer-card.component'
export class BuyerCardExtended extends BuyerCardComponent{
func a(){
do_something;
}
}
import { BuyerCardExtended } from './buyer-card-extended'
class BuyerCardComponent {
constructor(private buyerCardExtended: BuyerCardExtended){}
func b(){
this.buyerCardExtended.a()
}
}
检测到循环依赖中的警告: src/app/components/buyer/products/buyer-card/buyer-card.component.ts -> src/app/components/buyer/products/buyer-card/buyer-card-extended.ts -> src/app/ components/buyer/products/buyer-card/buyer-card.component.ts
浏览器:
"tslib.es6.js:25 Uncaught TypeError: Object prototype may only be an Object or null: undefined"
【问题讨论】:
-
把它们放在同一个文件中
-
“B 类扩展 A 类,以便我可以访问 A 类的实例和服务”听起来您正在使用继承进行代码共享。记住:composition over inheritance - 如果你只是想分享功能,那么模块化并包含它。扩展其他对象来执行此操作会污染您的架构,并导致您做出以后可能会后悔的设计决策。
-
将两个类共享的逻辑分离到第三个类中,以及每个类的不同之处。您不能将扩展类作为另一个依赖项。编译器将如何尝试解决这个问题?他需要创建一个BuyerCardExtended 才能创建BuyerCardComponent,但还需要BuyerCardComponent 来创建BuyerCardExtended。你创造了一个先有鸡还是先有蛋的问题。
-
实际上,在阅读您的下一句话时(我写第一篇评论时还没有),这是一个完美的例子,说明 为什么 代码共享的继承是错误的:“B 类有一些我将在 A 类中使用的功能" 你需要有
A extends B和B extends A才能工作...不工作都是在概念层面或在实施方面。 -
@BunyaminCoskuner,它们之前在同一个文件中,逻辑在一个大函数中,将圈复杂度增加到 20+(编码标准限制为 20)。因此,决定拆分逻辑
标签: angular typescript extends