3

我定义了以下类:

class Link {
    Action: string;
    DialogType: string;
    constructor ($link: JQuery) {
        this.Action = $link.attr('data-action') || '';
        this.DialogType = $link.attr('data-dialogType') || '';
    }
}

我有声明类实例的函数。一旦声明了类,我就可以使用智能感知并进行完整的类型检查:

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;

}

所以我的问题是如何对link使用上下文传递给函数 onDialogDone 的值进行类型检查?我是否正确地说,在我在该函数中创建一个新的变量链接之后,对链接所做的任何更改都不会对作为 this.link 传入的对象进行?

4

2 回答 2

2

这条线是做你想做的事的一种完全有效的方式:

var link: Link = this.link;

我建议将其更改为:

var link = <Link>this.link;

JavaScript 中的每个对象都是一个引用,您不能使用这一行创建新对象。因此,对新链接变量的任何更改都会反映在 this.link 上。

于 2012-11-12T15:04:01.407 回答
1

如果您使用lambda 语法link使您的成功(以及,就此而言,失败)函数匿名,则仍应键入的值:()=>

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*/ });
}
于 2012-11-12T15:26:46.167 回答