有没有办法创建默认界面对象?
示例:
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);
从我的研究中我没有找到办法做到这一点;但我希望我错过了一些东西。
答案 0 :(得分:14)
您可以使用稍微不同的语法并获取所有类型检查和IntelliSense。
interface IUserModel{
Name: string;
Age: number;
Email: string;
IsActive: boolean;
}
var user = <IUserModel>{};
您创建一个空的用户对象,但TypeScript编译器仍在检查您是否在该对象上有有效的属性,它仍然提供代码完成。
答案 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,
});