如何使用新的@types包进行TypeScript打字?

时间:2017-01-04 16:43:30

标签: typescript typescript-typings typescript2.0 definitelytyped

我已开始迁移基于namespace<reference>的大型TypeScript应用程序,以使用modules@types NPM存储库。但是,我每时每刻都会遇到问题。

  1. 很多图书馆甚至都没有打字。
  2. 很多图书馆都有完全过时的印刷品。
  3. 很多图书馆都有一个global打字文件,因此我不能import因为TS抱怨它不是模块。
  4. 当图书馆的NPM包中正确包含module形状的打字文件(如moment.js)时,TS仍然无法找到它,并且错误行{ {1}}说找不到模块。
  5. 这种技术的当前状态是什么?正如我第一眼看到的那样,它似乎远没有准备好生产。

    克服这些问题的技巧和技巧是什么?

    我定位import * as moment from 'moment'并使用es5作为es6配置。这可能是问题吗?据我所知,TS也支持modules输出的es6模块语法。

1 个答案:

答案 0 :(得分:3)

目前的工作方式绝对是生产就绪;但是,有一些事情并不明显,这不是你的错。

让我试着逐一回答你的问题。

  
      
  1. 很多图书馆甚至都没有打字。
  2.   

在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. 很多图书馆都有完全过时的印刷品。
  2.   

你绝对可以随意向DefinitelyTyped发送拉取请求,但如果你真的被时间束缚,你可以使用我给出的点(1)的方法。

  
      
  1. 很多图书馆都有一个global打字文件,因此我不能import因为TS抱怨它不是模块。
  2.   

如果您需要使用DefinitelyTyped中的全局声明文件,并且它不会自动包含在您的项目中,则可能需要将其添加到types的{​​{1}}字段中。 请参阅我的其他答案here,但问题的关键在于,如果您需要包含tsconfig.jsonfoo包的全局声明,并且您拥有bar和{{ 1}}安装后,您可以在@types/foo中编写以下内容。

@types/bar
  
      
  1. 当图书馆的NPM包中正确包含tsconfig.json形状的打字文件(如{ "compilerOptions": { "types": ["foo", "bar"] } } )时,TS仍然无法找到它,并且错误行{ {1}}说找不到模块。
  2.   

我认为这与您针对ES6的事实有关。尝试将您的module选项更改为moment.js中的import * as moment from 'moment'

"moduleResolution"

很抱歉这是一个问题。 理由是,实际具有此解析语义的唯一模块加载系统是CommonJS(Node使用的策略)。 我同意这可以改进。