繁体   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