使用默认值初始化动态创建的对象 - 使用泛型和接口
Posted
技术标签:
【中文标题】使用默认值初始化动态创建的对象 - 使用泛型和接口【英文标题】:Initialized dynamically created object with default values - Using Generics and Interfaces 【发布时间】:2019-07-02 17:26:42 【问题描述】:我需要初始化“gDetailDS”对象的初始值。我不能创建类而不是接口,并且接口不允许我设置默认值。
我曾尝试使用地图或其他功能来解决问题,但未能成功。使用map,报错“_this.gDetailDS.map is not a function”。
export interface InterfaceA
sysSeq: number;
code: string;
isUpdate: boolean;
version: number;
export interface InterfaceB
sysSeq: number;
name: string;
isReserved: boolean;
isPublic: boolean;
version: number;
export class DetailComponent<T> extends CoreComponent
gDetailDS: any;
constructor()
this.gDetailDS = <T> new Object;
我想专门为布尔值获取默认值。例如,在执行以下行之后,
this.gDetailDS = <InterfaceB> new Object;
我应该有一个 InterfaceB 类型的对象,它的默认设置为
this.gDetailDS.isReserved has default value "false";
this.gDetailDS.isPublic has default value "false";
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:一旦转译为 javascript,您的 DetailComponent<T>
就没有关于 T
的信息。所以不能直接用它来获取T的实例。
但是,如果您可以向 DetailComponent
构造函数添加参数,那么您的问题的解决方案是:
export class DetailComponent<T> extends CoreComponent
gDetailDS: T;
constructor(newInstance: new () => T)
this.gDetailDS = new newInstance();
class InterfaceAImpl implements InterfaceA
sysSeq: number;
code: string;
isUpdate: boolean;
version: number;
;
var detailComponent: DetailComponent<InterfaceA> = new DetailComponent<InterfaceA>(InterfaceAImpl);
【讨论】:
如何设置 isUpdate 的默认值?还有一点是,我不想为接口创建一个类。 和类型一样,一旦代码转译成javascript,接口就不存在了:Playground 那我知道哥们,转译后接口不存在了。但是在转译之前,我们如何初始化我们的接口值。 您也许可以看看下面的问题:How to use interface and default parameters together? 我不确定我们是否可以在不直接使用类(实现接口的类)或间接使用的情况下实现接口属性的默认值(比如使用一个工厂来构建你的接口类型的对象)。以上是关于使用默认值初始化动态创建的对象 - 使用泛型和接口的主要内容,如果未能解决你的问题,请参考以下文章
.Net利用泛型封装EF CodeFirst 数据库初始值设定项
Java学生信息表,Map存储对象,Map使用泛型和增强for循环来做