我已开始迁移基于namespace
和<reference>
的大型TypeScript应用程序,以使用modules
和@types
NPM存储库。但是,我每时每刻都会遇到问题。
global
打字文件,因此我不能import
因为TS抱怨它不是模块。module
形状的打字文件(如moment.js
)时,TS仍然无法找到它,并且错误行{ {1}}说找不到模块。这种技术的当前状态是什么?正如我第一眼看到的那样,它似乎远没有准备好生产。
克服这些问题的技巧和技巧是什么?
我定位import * as moment from 'moment'
并使用es5
作为es6
配置。这可能是问题吗?据我所知,TS也支持modules
输出的es6
模块语法。
答案 0 :(得分:3)
目前的工作方式绝对是生产就绪;但是,有一些事情并不明显,这不是你的错。
让我试着逐一回答你的问题。
- 很多图书馆甚至都没有打字。
醇>
在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;
}
- 很多图书馆都有完全过时的印刷品。
醇>
你绝对可以随意向DefinitelyTyped发送拉取请求,但如果你真的被时间束缚,你可以使用我给出的点(1)的方法。
- 很多图书馆都有一个
醇>global
打字文件,因此我不能import
因为TS抱怨它不是模块。
如果您需要使用DefinitelyTyped中的全局声明文件,并且它不会自动包含在您的项目中,则可能需要将其添加到types
的{{1}}字段中。
请参阅我的其他答案here,但问题的关键在于,如果您需要包含tsconfig.json
和foo
包的全局声明,并且您拥有bar
和{{ 1}}安装后,您可以在@types/foo
中编写以下内容。
@types/bar
- 当图书馆的NPM包中正确包含
醇>tsconfig.json
形状的打字文件(如{ "compilerOptions": { "types": ["foo", "bar"] } }
)时,TS仍然无法找到它,并且错误行{ {1}}说找不到模块。
我认为这与您针对ES6的事实有关。尝试将您的module
选项更改为moment.js
中的import * as moment from 'moment'
。
"moduleResolution"
很抱歉这是一个问题。 理由是,实际具有此解析语义的唯一模块加载系统是CommonJS(Node使用的策略)。 我同意这可以改进。