Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如果我的站点已经在使用矩.min.js,如何使用矩.js类型脚本定义文件?_Typescript_Momentjs - Fatal编程技术网

Typescript 如果我的站点已经在使用矩.min.js,如何使用矩.js类型脚本定义文件?

Typescript 如果我的站点已经在使用矩.min.js,如何使用矩.js类型脚本定义文件?,typescript,momentjs,Typescript,Momentjs,我正在将一个网站转换为使用TypeScript,我只是将许多JavaScript文件中的一个转换为TypeScript。 我的网站的所有页面都已经引用了moment.js,例如: <script src="/scripts/moment.min.js"></script> 。。。但目前看来,上述选择似乎是错误的。当我使用上述命令时(但将'moment'替换为'jquery'),会下载一个自述文件,其中说明: 这是矩()的存根类型定义。 Moment提供了自己的类型定义,

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

<script src="/scripts/moment.min.js"></script>
。。。但目前看来,上述选择似乎是错误的。当我使用上述命令时(但将'moment'替换为'jquery'),会下载一个自述文件,其中说明:

这是矩()的存根类型定义。 Moment提供了自己的类型定义,因此您不需要安装@types/Moment

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

///<reference path="../../Scripts/typeDeclarations/moment.d.ts"/>
var now:any = moment.utc();
///
var now:any=moment.utc();
但是,TypeScript给了我一个警告:

找不到名称“时刻”


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

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

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

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

这意味着现在应该有一个全局
时刻
变量可在全局上下文中访问,并且您不应该再看到
找不到名称“时刻”的错误


这应该是你需要做的全部

TL;博士

从github站点开始,在项目中添加()并在最后一行进行注释

 //export = moment;

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

项目结构

--
  |
  -typings/
     -moment/
       -moment.d.ts   <-- //export = moment; commented out
  -typescript/
     -main.ts
  -tsconfig.json
main.ts
文件包含

const now: moment.Moment = moment.utc();
并编译。。。正如预期的那样,我的IDE提供了从定义文件自动完成的功能。
(无需
//一种方法是创建自定义键入,例如
自定义键入/moment.d.ts

export * from 'moment'
export as namespace moment
并将该文件夹包含在您的
tsconfig.json
中:

{
  include: [
    "custom-typings"
  ]
}

从2.13.0版开始,Moment包含一个typescript定义文件。因此,如果使用此版本,可以执行以下操作:

import * as moment from 'moment';


let now = moment().format('LLLL');
注意:如果导入瞬间遇到问题,请尝试在
tsconfig.json
文件中的
编译器选项中添加
allowSyntheticDefaultImports:true


请访问官方网站以供参考。

您是否遵循了指南?它是否涵盖了您的用例?我不确定它是否涵盖了我的用例。我尝试了。结果是在生成的JavaScript中添加了一个require语句。但是,如果可能的话,我试图避免使用require语句。@VincenzoC从2018-06-20开始,typescript指南没有帮助,没有r他们的矩.d.ts文件-如果您不使用模块加载器,则会出现问题,ts会将导入语句转换为类似Object.defineProperty(导出,“\uu esModule”,{value:!0});var矩=require(“矩”);对我有效的是Bruno下面的ans,即从他们的d.ts文件中注释出//export=moment;。这对我有效。解决这个问题的时刻。我还想看看@unional的答案,因为它是实现同样目标的更好/更少干扰的方法。我喜欢这个解决方案,因为它不涉及编辑上游文件。出于某种原因,aft呃加入"包括"属性设置为my tsconfig.json文件,VS在生成时停止编译我的文件。它在保存.ts文件时执行,但在生成项目时不执行,这会在发布时给我带来问题。使用@dtabuenc解决方案。您是否有多个tsconfig文件?正如您所说,在保存.ts文件时执行
,这意味着它正在工作。也许您只是我没有在你的构建配置中包含
自定义类型。我得到了TS2498:…使用'export='并且不能与'export*'一起使用它仍然不起作用,但我找到了一个与你类似的替代方法:从“矩”开始导入*作为矩;export as namespace moment;export=moment;这只是文档的副本,我怀疑OP遵循了它,并假设OP使用ES6或CommonJS。是的,我仅在文档中找到它。
{
  include: [
    "custom-typings"
  ]
}
import * as moment from 'moment';


let now = moment().format('LLLL');