我定义了以下类:
class Link {
Action: string;
DialogType: string;
constructor ($link: JQuery) {
this.Action = $link.attr('data-action') || '';
this.DialogType = $link.attr('data-dialogType') || '';
}
}
我有声明该类实例的函数。一旦声明了类,我就可以使用intellisense并进行完整的类型检查:
function adminDialog($link: JQuery) {
var link = new Link($link);
link.Modal.MaxHeight = 600;
doDialogAjax(link);
}
在下面的doDialogAjax函数中,我仍然有完整的类型检查:
function doDialogAjax(link: Link) {
$.ajax( link.Url, {
cache: false,
context: { link: link },
dataType: 'html'
}).done(onDialogDone).fail(onDialogFail);
}
此时,如果我尝试访问this.link
,我将失去类型检查:
function onDialogDone(data: any, textStatus: string, jqXHR: JQueryXHR) {
// no type checking. I can type anything after this.link
var x = this.link.abcdefg;
// I assign to link
var link: Link = this.link;
// Now I get checking
var a = link.Modal.MaxHeight; // allowed
var a = link.abcdefg; // error
// However will the following change the property of the link passed
// into the function. I assume not but I am not 100% sure.
link.Modal.MaxHeight = 999;
}
所以我的问题是如何通过上下文传递给函数onDialogDone的link
值进行类型检查?我也是正确的说,在我在该函数中创建一个新的变量链接之后,对链接所做的任何更改都不会对作为this.link传入的对象进行吗?
答案 0 :(得分:2)
这条线是做你想做的完全有效的方式:
var link: Link = this.link;
我建议将其更改为:
var link = <Link>this.link;
JavaScript中的每个对象都是一个引用,并且您不会使用此行创建新对象。 因此,对新链接变量的任何更改都会反映在this.link上。
答案 1 :(得分:1)
如果使用link
lambda语法使您的成功(并且,就此而言,失败)函数匿名,则仍应键入()=>
的值:
function doDialogAjax(link: Link) {
$.ajax( link.Url, {
cache: false,
context: { link: link },
dataType: 'html'
}).done((data: any, textStatus: string, jqXHR: JQueryXHR) => {
var x = link.Modal.MaxHeight; // You should get type checking here without needing to do anything else, whether or not link is a property of the root 'this'.
}).fail((/*args*/)=> { /*Fail function*/ });
}