首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我的站点已经在使用Moment.js TypeScript定义文件,如何使用moment.min.js?

如果我的站点已经在使用Moment.js TypeScript定义文件,如何使用moment.min.js?
EN

Stack Overflow用户
提问于 2017-02-14 18:56:15
回答 4查看 9.8K关注 0票数 19

我正在将一个网站转换为使用TypeScript,我只是将许多JavaScript文件中的一个转换为TypeScript。我的站点的所有页面都已经引用了moment.js,例如:

代码语言:javascript
运行
复制
<script src="/scripts/moment.min.js"></script>

我使用以下方法添加了其他TypeScript定义文件:

代码语言:javascript
运行
复制
npm install --save-dev @types/jquery

..。但是,就目前而言,上述选择似乎是错误的。当我使用上面的命令时(但是用‘When’代替'jquery'),就会下载一个自述文件,上面写着:

这是矩的存根类型定义(https://github.com/moment/moment)。力矩提供了它自己的类型定义,所以您不需要安装@types/矩!

作为一种解决方案,我尝试将moment.d.ts文件从其GitHub repo中保存起来,并将其引用到TypeScript文件中,如下所示:

代码语言:javascript
运行
复制
///<reference path="../../Scripts/typeDeclarations/moment.d.ts"/>
var now:any = moment.utc();

但是,TypeScript给了我一个警告:

找不到“瞬间”这个名字

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-19 00:40:20

其中一种方法是创建自定义类型,例如custom-typings/moment.d.ts

代码语言:javascript
运行
复制
export * from 'moment'
export as namespace moment

并将该文件夹包含在您的tsconfig.json

代码语言:javascript
运行
复制
{
  include: [
    "custom-typings"
  ]
}
票数 10
EN

Stack Overflow用户

发布于 2017-02-17 06:14:34

TL;DR;

从github站点开始在项目中添加moment.d.ts (链接),最后一行是注释

代码语言:javascript
运行
复制
 //export = moment;

我已经创建了一个小型测试项目来证明这一点,这对我来说是可行的。

项目结构

代码语言:javascript
运行
复制
--
  |
  -typings/
     -moment/
       -moment.d.ts   <-- //export = moment; commented out
  -typescript/
     -main.ts
  -tsconfig.json

typingstypescript的内容都是编译目标的一部分,即在如下所示的tsconfig.json中不排除

代码语言:javascript
运行
复制
{
    "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文件包含

代码语言:javascript
运行
复制
const now: moment.Moment = moment.utc();

然后编译..。正如预期的那样,我的IDE可以从定义文件中自动完成。(不需要使用///<reference标记--无论如何,您应该避免使用它们)

删除定义文件末尾的export语句,将其“转换”为内部-但全局-模块声明文件。

票数 13
EN

Stack Overflow用户

发布于 2017-02-17 03:39:26

不幸的是,the类型声明是用纯模块化语法编写的。这是因为现在很多人使用npm来获取js包,然后使用模块加载器(如Webpack或Browserify )将npm模块打包成一种可供浏览器使用的格式。

在您的示例中,您不是在使用模块,而是依赖于在全局上下文中导入浏览器脚本。为了支持这一点,定义文件的作者应该按照UMD准则进行定义,这是编写定义的一种方式,以便他们支持模块化和全局环境使用。

幸运的是,将其添加到定义的副本中非常容易。只需将以下一行添加到moment.d.ts顶部

代码语言:javascript
运行
复制
export as namespace moment;

这基本上是说,当您使用三重斜杠指令引用moment.d.ts时,它将使从模块导出的所有内容都可以在全局命名空间中使用,名称为“when”。

这意味着现在应该有一个全局moment变量可以在全局上下文中访问,并且您不应该再看到Cannot find the name 'moment'错误。

这应该是你所需要做的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42234096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档