我正在将一个网站转换为使用TypeScript,我只是将许多JavaScript文件中的一个转换为TypeScript。我的站点的所有页面都已经引用了moment.js,例如:
<script src="/scripts/moment.min.js"></script>
我使用以下方法添加了其他TypeScript定义文件:
npm install --save-dev @types/jquery
..。但是,就目前而言,上述选择似乎是错误的。当我使用上面的命令时(但是用‘When’代替'jquery'),就会下载一个自述文件,上面写着:
这是矩的存根类型定义(https://github.com/moment/moment)。力矩提供了它自己的类型定义,所以您不需要安装@types/矩!
作为一种解决方案,我尝试将moment.d.ts文件从其GitHub repo中保存起来,并将其引用到TypeScript文件中,如下所示:
///<reference path="../../Scripts/typeDeclarations/moment.d.ts"/>
var now:any = moment.utc();
但是,TypeScript给了我一个警告:
找不到“瞬间”这个名字
发布于 2017-02-19 00:40:20
其中一种方法是创建自定义类型,例如custom-typings/moment.d.ts
export * from 'moment'
export as namespace moment
并将该文件夹包含在您的tsconfig.json
中
{
include: [
"custom-typings"
]
}
发布于 2017-02-17 06:14:34
TL;DR;
从github站点开始在项目中添加moment.d.ts
(链接),最后一行是注释
//export = moment;
我已经创建了一个小型测试项目来证明这一点,这对我来说是可行的。
项目结构
--
|
-typings/
-moment/
-moment.d.ts <-- //export = moment; commented out
-typescript/
-main.ts
-tsconfig.json
typings
和typescript
的内容都是编译目标的一部分,即在如下所示的tsconfig.json
中不排除
{
"compilerOptions": {
"target": "es5",
"declaration": false,
"noImplicitAny": true,
"removeComments": true,
"outDir": "dist",
"jsx": "react",
"sourceMap": true,
"experimentalDecorators": true
},
"compileOnSave": true,
"exclude": [
"node_modules",
"dist"
]
}
main.ts
文件包含
const now: moment.Moment = moment.utc();
然后编译..。正如预期的那样,我的IDE可以从定义文件中自动完成。(不需要使用///<reference
标记--无论如何,您应该避免使用它们)
删除定义文件末尾的export
语句,将其“转换”为内部-但全局-模块声明文件。
发布于 2017-02-17 03:39:26
不幸的是,the类型声明是用纯模块化语法编写的。这是因为现在很多人使用npm来获取js包,然后使用模块加载器(如Webpack或Browserify )将npm模块打包成一种可供浏览器使用的格式。
在您的示例中,您不是在使用模块,而是依赖于在全局上下文中导入浏览器脚本。为了支持这一点,定义文件的作者应该按照UMD准则进行定义,这是编写定义的一种方式,以便他们支持模块化和全局环境使用。
幸运的是,将其添加到定义的副本中非常容易。只需将以下一行添加到moment.d.ts
顶部
export as namespace moment;
这基本上是说,当您使用三重斜杠指令引用moment.d.ts
时,它将使从模块导出的所有内容都可以在全局命名空间中使用,名称为“when”。
这意味着现在应该有一个全局moment
变量可以在全局上下文中访问,并且您不应该再看到Cannot find the name 'moment'
错误。
这应该是你所需要做的。
https://stackoverflow.com/questions/42234096
复制相似问题