簡體   English   中英

如何使用新的@types包鍵入TypeScript?

[英]How to use the new @types packages for TypeScript typings?

我已經開始遷移現有的大型,基於namespace<reference>的TypeScript應用程序,以使用modules@types NPM存儲庫。 但是,我每秒都遇到問題。

  1. 許多圖書館甚至都沒有打字。
  2. 許多圖書館在那里的打字完全過時了。
  3. 許多庫都有global文件,導致我無法import它,因為TS抱怨它不是模塊。
  4. 當一個庫的NPM包中正確包含了一個module形狀的類型文件(例如moment.js )時,TS似乎仍然找不到它,並且import * as moment from 'moment'說模塊未找到而導致行import * as moment from 'moment'錯誤。

該技術的當前狀態是什么? 乍看之下,它似乎還遠遠沒有做好生產准備。

解決這些問題的技巧和技巧是什么?

我的目標是es5並使用es6作為modules配置。 這可能是問題嗎? 據我所知,TS也支持es5輸出的es6模塊語法。

當前完成工作的方式絕對可以用於生產。 但是,有些事情並不明顯,這也不是您的錯。

讓我嘗試一個接一個地回答您的問題。

  1. 許多圖書館甚至都沒有打字。

在TypeScript 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;
}
  1. 許多圖書館在那里的打字完全過時了。

您絕對可以隨意向DefinitelyTyped發送拉取請求,但是如果您真的很費時間,則可以使用我針對要點(1)給出的方法。

  1. 許多庫都有global文件,導致我無法import它,因為TS抱怨它不是模塊。

如果您需要使用DefinitelyTyped中的全局聲明文件,並且該文件未自動包含在您的項目中,則可能需要將其添加到tsconfig.jsontypes字段中。 在這里看到我的其他答案,但是關鍵是如果您需要包括foobar軟件包的全局聲明,並且已經安裝了@types/foo@types/bar ,則可以在tsconfig.json編寫以下tsconfig.json

{
    "compilerOptions": {
        "types": ["foo", "bar"]
    }
}
  1. 當一個庫的NPM包中正確包含了一個module形狀的類型文件(例如moment.js )時,TS似乎仍然找不到它,並且import * as moment from 'moment'說模塊未找到而導致行import * as moment from 'moment'錯誤。

我認為這與您以ES6為目標有關。 嘗試在tsconfig.json "node" tsconfig.json "moduleResolution"選項更改為"node"

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

抱歉,這是一個陷阱。 基本原理是,唯一具有這種解析語義的模塊加載系統是CommonJS(Node使用的策略)。 我同意可以改善這一點。

暫無
暫無

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

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