[英]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.