簡體   English   中英

如何強制鍵入將全局(環境)模塊用作外部模塊?

[英]How to force typings to use a global (ambient) module as external one?

我想在我的項目中使用一些.d.ts定義,比方說jQuery。 我想這樣包含它(或以類似方式)

import {$} from 'jquery';

而不是在全球范圍內使用(我的實際用例中有很多名稱沖突)。

但是dt〜jquery是一個全局模塊。 顯然,我得到一個錯誤:

> typings install dt~jquery --save

typings ERR! message Attempted to compile "jquery" as an external module,
  but it looks like a global module. You'll need to enable the global option to continue.

typings不能自動將其包裝在declare module (為什么不這樣)? 如果不是,那么手動執行此操作的常規方式是什么,以使我的存儲庫貢獻者不必擔心它?

我想需要一個本地修改的.d.ts副本。 如果是這樣,應該將其放置在哪里(我的typings目錄是.gitignored,因此自定義.d.ts可能應該單獨存儲,並不能與types.json相對)?

更新:我已經設法將jQuery和其他全局模塊轉換為外部模塊,只需將它們包裝在declare module 'module_name' { ... } ,放在我命名為custom_typings的文件夾下,並在其中創建index.d.ts 它可以在我的IDE上正常工作並進行編譯。 問題是, tsc在捆綁的amd輸出中不包括那些導入。 這很奇怪,因為我在這里遇到了完全相反的問題(tsc在js輸出中包括了外部.d.ts導入,這使webpack感到困惑)。

// modified_jquery_typing.d.ts
declare module 'jquery' {
  ...code from DefinitelyTyped...

  export var jQuery: JQueryStatic;
}

// app.ts
import {thing} from 'actual_ts_file';
import {jQuery} from 'jquery';

// app.js contains .ts import but not .d.ts
define("app", ["require", "exports", "actual_ts_file"], ...)

UPDATE(2) :這很愚蠢,只是由於未使用jQuery導入而將其忽略了。 它確實有效。 不過,我想知道這是否是執行我想要的正確方法。

我想你只需import $ from 'jquery'; (無括號),因為導出是您想要的,而不是作為多個導出的模塊,而您僅從中提取一個。

然后,您打算同時使用兩個版本的jquery嗎? 鍵入不需要處理您不要求打字稿編譯器考慮的代碼。 如果您將$某些版本無沖突的$傳遞給您的打字稿代碼,那么通常您將必須傳遞該非全局引用。

該導入還應引入您需要強類型鍵入將要傳遞的JQuery類型參數的類型定義。

===

雖然我完全同意特殊情況下的輸入並因打字稿混淆而導入,但我沒有遵循您所需要的確切設置。 類型定義不是私有的,就打字稿而言,類型隨處可見。 這與污染運行時全局名稱空間不同,d.ts文件不會這樣做。 這些類型隨處可見以約束您的代碼,但不會增加運行時的開銷。

風險在於為$名稱定義環境定義,而在運行時實際上並不會存在-以這種特定方式破壞強類型環境的目的。

如果您只是說import 'jquery'而未定義$什么? 我想您仍然可以引用這些類型來傳遞有范圍的,無沖突的jquery對象,但是也許打字稿不會用這種用法定義$

暫無
暫無

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

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