使用默认值初始化动态创建的对象 - 使用泛型和接口

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&lt;T&gt; 就没有关于 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 数据库初始值设定项

使用泛型和合并对象的 Typescript 声明文件

使用支持对象/结构的泛型时如何返回空值/默认值? [复制]

Java学生信息表,Map存储对象,Map使用泛型和增强for循环来做

盘点一下面试官最爱问的泛型和包装类,建议反复观看,真的写的非常详细

C# 泛型和类型检查