默认接口对象

N. *_*len 6 typescript

有没有办法创建默认的接口对象?

例:

interface myInterface {
    A: string;
    B: string;
    C: number;
    D: CustomType; // A custom class
}
Run Code Online (Sandbox Code Playgroud)

通常,您可以通过以下方式创建此接口的对象:

var myObj: myInterface = {
    A: "",
    B: "",
    C: 0,
    D: null
}
Run Code Online (Sandbox Code Playgroud)

然而,如果有一些语法糖就像这样做会很好:

var myObj = new myInterface;
// OR
var myObj = default(myInterface);
Run Code Online (Sandbox Code Playgroud)

根据我的研究,我没有找到办法做到这一点; 但我希望我错过了一些东西.

Mat*_*cic 14

您可以使用稍微不同的语法并获取所有类型检查和IntelliSense.

interface IUserModel{
  Name: string;
  Age: number;
  Email: string;
  IsActive: boolean;
}

var user = <IUserModel>{};
Run Code Online (Sandbox Code Playgroud)

您创建一个空的用户对象,但TypeScript编译器仍在检查您是否在该对象上有有效的属性,它仍然提供代码完成.

在此输入图像描述

在此输入图像描述


Mar*_*rot 2

不,那里没有。

接口声明仅存在于编译时,因此唯一执行此类操作的时间是在编译时。不幸的是,编译器没有提供任何语言构造来执行此操作,也没有提供任何扩展编译过程的方法。


解决这个问题的一种方法是进行一些代码生成;添加一个函数来创建具有正确结构的对象。这种方法的问题在于,您要么必须解析 TypeScript 代码,要么必须解析某些领域特定语言。

读这样的内容:

<Definitions>
    <Interface Name="myInterface">
        <Member name="A" type="string"/>
        <Member name="B" type="string"/>
        <Member name="C" type="number"/>
        <Member name="D" type="CustomType"/>
    </Interface>
</Definitions>
Run Code Online (Sandbox Code Playgroud)

并生成如下内容:

interface myInterface {
    A: string;
    B: string;
    C: number;
    D: CustomType;
}

function InitMyInterface(obj?: any): myInterface {
    if (obj === undefined) obj = {};
    return {
        A: obj.A === undefined ? "" : obj.A,
        B: obj.B === undefined ? "" : obj.B,
        C: obj.C === undefined ? 0 : obj.C,
        D: obj.D === undefined ? null : obj.D, // or InitCustomType(obj.D)
    };
}
Run Code Online (Sandbox Code Playgroud)