簡體   English   中英

在將類型聲明為環境外部模塊定義時如何聲明參數類型

[英]How to declare parameter types when type is declared as ambient external module definition

假設您有一個如下所示的ViewModel(或其他RequireJS模塊):

define(['plugins/dialog'], function (dialog: /* what type should go here? */) {

/* rest of module */

}

作為參考,我們感興趣的類型是Dialog接口,該接口在durandal.d.ts中定義如下:

declare module 'plugins/dialog' {
    interface Dialog {
        owner: any;
        context: DialogContext;
        activator: DurandalActivator<any>;
        close(): JQueryPromise<any>;
        settings: composition.CompositionContext;
    }
}

這種類型的模塊定義稱為“ 環境外部模塊聲明” 就像@basarat 在這里指出的那樣,您需要使用import來訪問這些模塊。 這是您的ViewModel需要更新的方式:

import dialogModule = require('plugins/dialog');
define(['plugins/dialog'], function (dialog: dialogModule.Dialog) {

/* rest of module */

}

這在編譯時有效,但是現在生成的JavaScript如下所示:

define(["require", "exports"], function(require, exports) {
    define([

    /* rest of module */

    });
});

您可以看到模塊包裝在一個額外的“ define() ”調用中。 當您嘗試顯示對話框時(即,Durandal嘗試檢索此模塊時),這會導致不匹配的匿名定義錯誤

因此,是否可以“導入”並利用環境外部模塊聲明中的類型,而無需將文件包裝在額外的define()

理想情況下,Durandal .d.ts將以不同的方式編寫(這樣,您就可以在不導入模塊的情況下訪問界面)。

作為一種實用的解決方案,您可以使用--module commonjs而不是--module amd來編譯文件。 require調用將被優化,您仍將獲得類型信息。

您也可以使用--module amd編譯,然后重寫代碼以不顯式調用define (只是讓編譯器生成它,就像它試圖這樣做一樣),盡管我假設您出於故意原因避免這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM