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

ラムダ構文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 に答える