默认接口对象

时间:2012-11-10 22:15:16

标签: typescript

有没有办法创建默认界面对象?

示例:

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

通常你会通过以下方式创建这个界面的对象:

var myObj: myInterface = {
    A: "",
    B: "",
    C: 0,
    D: null
}

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

var myObj = new myInterface;
// OR
var myObj = default(myInterface);

从我的研究中我没有找到办法做到这一点;但我希望我错过了一些东西。

3 个答案:

答案 0 :(得分:14)

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

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

var user = <IUserModel>{};

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

enter image description here

enter image description here

答案 1 :(得分: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>

并生成如下内容:

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)
    };
}

答案 2 :(得分:0)

要完成@Matija,您也可以在一行中完成,并且您的ide(例如视觉工作室代码)会自动为您完成:

var user = <IUserModel>{
    Name : "foo";
};

如果您想将Interface设置为参数,这将有所帮助,因此这也是有效的(JQueryAjaxSettings是一个接口,jquery.d.ts的一部分可以通过tsd install jquery获得:)< / p>

jQuery.ajax("foo/bar",
    <JQueryAjaxSettings>{
        dataType:"json",
        cache : true,

    });