如何在angular2打字稿应用程序中使用moment.js库?

我试图用typecript绑定来使用它:

npm install moment --save typings install moment --ambient -- save 

test.ts:

 import {moment} from 'moment/moment'; 

没有:

 npm install moment --save 

test.ts:

 var moment = require('moment/moment'); 

但是当我打电话给moment.format(),我得到一个错误。 应该是简单的,任何人都可以提供一个命令行/导入组合,将工作?

我们现在使用模块,尝试import {MomentModule} from 'angular2-moment/module'; 在npm后安装angular2-moment .. http://ngmodules.org/modules/angular2-moment

2017年4月更新:

从版本2.13.0开始,Moment包含一个打字稿定义文件。 https://momentjs.com/docs/#/use-it/typescript/

只需在你的控制台types中用npm安装

 npm install --save moment 

然后在你的Angular应用中,导入就像这样简单:

 import * as moment from 'moment'; 

就是这样,你得到完整的Typescript支持!

奖金编辑:要键入一个variables或属性作为手稿中的Moment你可以做到这一点,例如:

 let myMoment: moment.Moment = moment("someDate"); 

moment是第三方的全球资源。 当前对象在浏览器中的window上生存。 因此, importimport到您的angular2应用程序中是不正确的。 而是在你的html中包含<script>标签,它将载入这个moment.js文件。

为了使TypeScript快乐,你可以添加

 declare var moment: any; 

在你使用它的文件的顶部停止编译错误,或者你可以使用

 ///<reference path="./path/to/moment.d.ts" /> 

或者使用tsd来安装TypeScript可能自己find的moment.d.ts文件。

 import {Component} from 'angular2/core'; declare var moment: any; @Component({ selector: 'example', template: '<h1>Today is {{today}}</h1>' }) export class ExampleComponent{ today: string = moment().format('D MMM YYYY'); } 

只要确保添加脚本标记在您的HTML或片刻将不存在。

 <script src="node_modules/moment/moment.js" /> 

模块加载moment

首先,您需要设置一个模块加载器(如System.js)来加载commonjs文件

 System.config({ ... packages: { moment: { map: 'node_modules/moment/moment.js', type: 'cjs', defaultExtension: 'js' } } }); 

然后在需要使用的地方input文件

 import * as moment from 'moment'; 

要么

 import moment = require('moment'); 

编辑:

还有一些捆绑器的选项,比如Webpack或者SystemJS构build器或者Browserify,它们可以保持closures窗口对象的时刻。 欲了解更多有关这些信息,请访问他们各自的网站的指示。

以下为我工作。

首先,安装时刻的types定义。

typings install moment --save

(注意:不 – – --ambient

那么,要解决缺乏适当的出口:

 import * as moment from 'moment'; 

我会去跟随:

npm install moment --save

给你的systemjs.config.js文件的map数组添加:

'moment': 'node_modules/moment'

packages数组添加:

'moment': { defaultExtension: 'js' }

在你的component.ts中使用: import * as moment from 'moment/moment';

就是这样。 你可以使用你的组件的类:

today: string = moment().format('D MMM YYYY');

要在一个Typescript项目中使用它,你将需要安装时间:

npm install moment --save

安装完毕后,您可以在导入后在任何.ts文件中使用它:

import * as moment from "moment";

—更新11/01/2017

现在不推荐使用types,它被npm @types取代。 从现在开始,获取types声明将不需要npm之外的工具。 要使用Moment,不需要通过@types安装types定义,因为Moment已经提供了自己的types定义。

所以,它只需要3步:

1 – 安装包含types定义的时刻:

 npm install moment --save 

2 – 在HTML文件中添加脚本标签:

 <script src="node_modules/moment/moment.js" /> 

3 – 现在你可以使用它。 期。

 today: string = moment().format('D MMM YYYY'); 

—原来的答案

这可以通过3个步骤完成:

1 – 安装时刻定义 – * .d.ts文件:

 typings install --save --global dt~moment dt~moment-node 

2 – 在HTML文件中添加脚本标签:

 <script src="node_modules/moment/moment.js" /> 

3 – 现在你可以使用它。 期。

 today: string = moment().format('D MMM YYYY'); 

如果你可以添加更多的第三方软件包,我使用了angular2-moment库。 安装非常简单,您应该按照README上的最新说明进行操作。 我也安装了types的结果。

像我一样的魅力,几乎没有添加任何代码,以使其工作。

angular2-moment库的pipe道像{{myDate | amTimeAgo}}在.html文件中使用。

这些相同的pipe道也可以作为组件类(.ts)文件中的Typescript函数来访问。 首先按照说明安装库:

 npm install --save angular2-moment 

在node_modules / angular2-moment现在将是“.pipe.d.ts”文件,如calendar.pipe.d.tsdate-format.pipe.d.ts等等。

其中每个包含等效pipe道的Typescript函数名称,例如, DateFormatPipe()amDateFormatPipe的函数。

要在项目中使用DateFormatPipe ,请将其导入并添加到app.module.ts中的全局提供程序中:

 import { DateFormatPipe } from "angular2-moment"; ..... providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, ...., DateFormatPipe] 

然后在任何你想使用该函数的组件中,将它导入到顶层,注入到构造函数中并使用:

 import { DateFormatPipe } from "angular2-moment"; .... constructor(......., public dfp: DateFormatPipe) { let raw = new Date(2015, 1, 12); this.formattedDate = dfp.transform(raw, 'D MMM YYYY'); } 

要使用这个过程中的任何一个function。 如果有一种方法可以访问所有的function,那将是很好的,但是上面的解决scheme都不适合我。

不知道这是否仍然是一个问题,但是…使用SystemJS和MomentJS作为图书馆,这解决了它对我来说

 /* * Import Custom Components */ import * as moment from 'moment/moment'; // please use path to moment.js file, extension is set in system.config // under systemjs, moment is actually exported as the default export, so we account for that const momentConstructor: (value?: any) => moment.Moment = (<any>moment).default || moment; 

从那里为我工作很好。

为angular2 RC5这为我工作…

首先通过npm安装

 npm install moment --save 

然后在要使用它的组件中导入时刻

 import * as moment from 'moment'; 

最后在systemjs.config.js中configuration“map”和“packages”

 // map tells the System loader where to look for things var map = { .... 'moment': 'node_modules/moment' }; // packages tells the System loader how to load when no filename and/or no extension var packages = { ... 'moment': { main:'moment', defaultExtension: 'js'} }; 

除了SnareChop的回答之外,我不得不改变momentjs的打字文件。

moment-node.d.ts我replace:

 export = moment; 

 export default moment; 

Moment.js现在支持v2.14.1中的TypeScript。

请参阅: https : //github.com/moment/moment/pull/3280

尝试添加"allowSyntheticDefaultImports": true到您的tsconfig.json

国旗是做什么的?

这基本上告诉TypeScript编译器,可以使用ES6导入语句,即

 import * as moment from 'moment/moment'; 

在像Moment.js这样的CommonJS模块上没有声明默认的导出。 该标志只影响types检查,而不是生成的代码。

如果你使用SystemJS作为你的模块加载器是必要的。 如果您告诉TS编译器您使用SystemJS,该标志将自动打开:

 "module": "system" 

这也将删除由IDEs引发的错误,如果它们被configuration为使用tsconfig.json

对于ANGULAR CLI用户

使用外部库在这里的文档:

https://github.com/angular/angular-cli/wiki/stories-third-party-lib

只需通过安装你的库

npm安装lib-name –save

并将其导入到您的代码中。 如果图书馆不包括types,您可以使用以下方式安装它们:

npm安装lib-name –save

npm install @ types / lib-name –save-dev

然后打开src / tsconfig.app.json并将其添加到types数组中:

“types”:[“lib-name”]

如果您添加types的库仅用于e2etesting,请使用e2e / tsconfig.e2e.json。 unit testing和src / tsconfig.spec.json也是一样。

如果库在@ types /中没有可用types,则仍可以通过手动添加types来使用它:

首先,在src /文件夹中创build一个typings.d.ts文件。

该文件将被自动包含为全局types定义。 然后,在src / typings.d.ts中添加以下代码:

申报模块'typeless-package';

最后,在使用该库的组件或文件中,添加以下代码:

从'typeless-package'导入*作为无types包; typelessPackage.method();

完成。 注意:您可能需要或发现有用的定义您尝试使用的库的更多types。

以下为我工作:

 typings install dt~moment-node --save --global 

types节点不存在于types库中。 你需要redirect到Definitely Typed才能使用前缀dt工作。

用systemjs我做的是,在我的systemjs.config里面我添加了地图moment

 map: { ....., 'moment': 'node_modules/moment/moment.js', ..... } 

然后你就可以轻松地导入moment

 import * as moment from 'moment' 

对于angularj与systemjs和jspm必须做的:

 import * as moment_ from 'moment'; export const moment = moment_["default"]; var a = moment.now(); var b = moment().format('dddd'); var c = moment().startOf('day').fromNow(); 

我知道这是一个古老的线程,但对我来说,最简单的解决scheme实际上是:

  1. 首先npm install moment --save
  2. 在我的组件需要从node_modules并使用它:
 const moment = require('../../../node_modules/moment/moment.js'); @Component({...}) export class MyComponent { ... ngOnInit() { this.now = moment().format(); } ... } 

与ng cli

 > npm install moment --save 

在app.module

 import * as moment from 'moment'; providers: [{ provide: 'moment', useValue: moment }] 

在组件中

 constructor(@Inject('moment') private moment) 

这种方式你一次导入

我遵循的build议,允许allowSyntheticDefaultImports(因为没有出口时刻为我使用),使用系统。 然后我遵循某人的build议来使用:

 import moment from 'moment'; 

随着时刻映射在我的system.jsconfiguration。 其他import声明不适用于我,出于某种原因