6

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

例子:

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

根据我的研究,我还没有找到一种方法来做到这一点;但我希望我只是错过了一些东西。

4

3 回答 3

14

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

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

var user = <IUserModel>{};

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

在此处输入图像描述

在此处输入图像描述

于 2015-07-20T19:15:13.187 回答
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)
    };
}
于 2012-11-10T22:54:02.263 回答
0

要完成@Matija,您也可以在一行中完成,并且您的 ide(例如 Visual Studio 代码)会自动为您完成它:

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

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

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

    });
于 2015-11-10T15:49:00.100 回答