0

我已經開始遷移基於TypeScript的現有大型namespace<reference>,以便使用modules@types NPM存儲庫。不過,我每秒都會遇到問題。如何將新的@types包用於TypeScript類型?

  1. 許多圖書館甚至沒有打字。
  2. 很多圖書館在那裏已經完全過時了。
  3. 許多庫有一個global打字文件,導致我不能import它,因爲TS抱怨說它不是一個模塊。
  4. 當一個磁帶庫有一個module形狀的打字文件正確包含在它的NPM包(如moment.js)中時,TS似乎仍然無法找到它,並且找不到線import * as moment from 'moment'說找不到模塊。

這種技術的現狀是什麼?正如我第一眼看到的那樣,它似乎遠沒有準備好生產。

什麼是黑客和技術來克服這些問題?

我瞄準es5和使用es6作爲modules配置。這可能是問題嗎?據我所知,TS支持es5輸出的es6模塊語法。

回答

3

目前的做法完全是生產準備;但是,有幾件事情不明顯,那不是你的錯。

讓我試着一一回答你的問題。

  1. ,許多圖書館甚至不具備分型有。

在打字稿2.1,只要你有安裝在node_modules一個包,你沒有noImplicitAny開啓,你可以輸入任何你想要的。

如果你不想使用noImplicitAny(這我會建議您希望隨着時間的增長任何項目),你可以隨時創建聲明模塊項目源文件夾中的declarations.d.ts因爲你需要:

// do anything you want when you import `"foo"` now. 
declare module "foo"; 

// can only access the `hello` export when importing `"bar"`. 
declare module "bar" { 
    export var hello; 
} 
  • 許多庫具有完全過時分型存在。
  • 你一定要隨時發送拉請求DefinitelyTyped,但如果你真的時間有限,你可以用我給的點(1)的方法。

  • 大量文庫的具有global分型文件,導致我不能import它,因爲TS抱怨說,它不是一個模塊。
  • 如果您需要使用從DefinitelyTyped一個全球性的聲明文件,並且它不會自動包含在你的項目,你可能必須將它添加到types場在tsconfig.json。 看我其他的答案here,但問題的癥結所在是,如果你需要包括全局聲明爲foobar包,和你有@types/foo和安裝@types/bar,你可以寫在你的tsconfig.json以下。

    { 
        "compilerOptions": { 
         "types": ["foo", "bar"] 
        } 
    } 
    
  • 當一個庫具有正確地包含在它一個module成形打字文件的NPM包(如moment.js),TS似乎仍然是無法找到它,和錯誤行import * as moment from 'moment'說找不到模塊。
  • 我認爲這與您的目標是ES6有關。嘗試在您的tsconfig.json中將"moduleResolution"選項更改爲"node"

    { 
        "compilerOptions": { 
         "moduleResolution": "node" 
        } 
    } 
    

    對不起,這是一個難題。 其基本原理是實際上具有此解析語義的唯一模塊加載系統是CommonJS(Node使用的策略)。 我同意這可以改進。

    +0

    謝謝您的詳細解答,我真的很感激。我會再看看我目前所有的混亂情況,並提供一些反饋。 –

    +0

    再次感謝您,我會接受您的答案,因爲它在技術上回答了我的問題,並給了我很好的提示。但是,我遇到了後續問題,如果您有幾分鐘的時間,請在此處查看。 http://stackoverflow.com/questions/41474704/how-could-i-update-the-knockout-typing-file-to-be-typescript-2-0-friendly –

    相關問題