gpt4 book ai didi

angular - typescript - 继承静态属性没有静态关键字

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:18 24 4
gpt4 key购买 nike

我有多个类代表数据库中的实体。

abstract class Entity {
static columns: Column[];
static showInNav: boolean;
static dependencies: string[];
// non-static fields
}
class Entity_A extends Entity {
//static properties redeclaration
//non-static properties
}
class Entity_B extends Entity {
//static properties redeclaration
//non-static properties
}

每个类都扩展实体或其子类之一。在初始化阶段,我将类放在数组 [Entity_A, Entity_B, ...] 中,遍历它们并读取它们的属性以了解如何设置应用程序。静态属性基本上是我的配置。

问题是, typescript 中没有静态契约(Contract),这使得很容易犯错误,而且很难找到它(我读过这通常不是一个好的做法)。我可以将静态属性更改为方法,只需执行 new currentClass().property。但我相信一定有更好的方法。

有什么想法吗?

编辑(我真正想要的):我希望能够在类中安全地定义“配置”(类型检查 + 强制覆盖)并在给定类数组时轻松访问它

最佳答案

您可以在模块中隐藏实际的 Entity 类(而不是导出它),并且只导出一个函数,该函数将所需的静态字段作为参数。此函数将返回一个派生自隐藏基类的类,并将覆盖静态字段。此函数的结果将用作派生实体的基类:

实体.ts

abstract class EntityImpl {
static columns: Column[];
static showInNav: boolean;
static dependencies: string[];
abstract doStuff(): void;
}
export interface Column {
// Dummy for this sample
}

export function Entity(required: { columns: Column[]; showInNav: boolean; dependencies: string[];}) {
abstract class Entity extends EntityImpl {
static columns: Column[] = required.columns
static showInNav: boolean = required.showInNav;
static dependencies: string[] = required.dependencies;
}
return Entity;
}
// Export a type definition so we can use the base type as needed
export type Entity = EntityImpl;
// Export a type definition that represents the type, so we can access all the static props
export type EntityClass = typeof EntityImpl;

impl.ts

import { Entity, EntityClass } from './entity'

class Entity_A extends Entity({
columns: [],
dependencies: [],
showInNav: true
}) {
doStuff(): void {} //abstract methids HAVE to be imlementes as expected
}

class Entity_B extends Entity({
columns: [],
dependencies: [],
showInNav: false
}) {
doStuff(): void {}
}

// Array of types, with save access
var allClasses : Array<EntityClass> = [Entity_A, Entity_B];
for(let type of allClasses) {
console.log(type.showInNav);
}

// Array of instances, with save access
var data: Array<Entity> = [new Entity_A(), new Entity_B()];
data.forEach(x => x.doStuff());

这种方法使字段保持静态,并强制实现者指定它们。据我所知,诸如强制您实现抽象方法等功能也很有效。

如果您需要一个派生 Entity 但又是其他类的基类的类,您可以应用相同的模式,即将它封装在一个函数中并将该函数用作基类。

关于angular - typescript - 继承静态属性没有静态关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com