如何在angular 2打字本应用程序中使用moment.js库?

Ser*_*hov 209 typescript angular

我尝试将它与typescript绑定一起使用:

npm install moment --save
typings install moment --ambient -- save
Run Code Online (Sandbox Code Playgroud)

test.ts:

import {moment} from 'moment/moment';
Run Code Online (Sandbox Code Playgroud)

没有:

npm install moment --save
Run Code Online (Sandbox Code Playgroud)

test.ts:

var moment = require('moment/moment');
Run Code Online (Sandbox Code Playgroud)

但是当我调用moment.format()时,我收到一个错误.应该很简单,任何人都可以提供一个可行的命令行/导入组合吗?

Hin*_*ich 471

2017年4月更新:

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

只需在控制台类型中使用npm安装它

npm install --save moment
Run Code Online (Sandbox Code Playgroud)

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

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

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

奖励编辑:要像Moment在Typescript中键入变量或属性,您可以这样做:

let myMoment: moment.Moment = moment("someDate");
Run Code Online (Sandbox Code Playgroud)

  • @Katherine R你可以在任何文件中使用它,它不是Angular特有的. (3认同)
  • 将它添加到您的 app.module 文件并导入数组是否重要?或者你可以简单地将它导入到一个组件中并使用它? (2认同)
  • 现在,moment 插件呢,比如moment-round? (2认同)
  • 实际上,这个答案不是特定于Angular的,它适用于任何Typescript项目。 (2认同)

Sna*_*ops 97

moment是第三方全球资源.当前对象存在于window浏览器中.因此import在angular2应用程序中它是不正确的.而是<script>在html中包含将加载moment.js文件的标记.

要使TypeScript满意,您可以添加

declare var moment: any;
Run Code Online (Sandbox Code Playgroud)

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

///<reference path="./path/to/moment.d.ts" />
Run Code Online (Sandbox Code Playgroud)

或者使用tsd来安装TypeScript可能在其上找到的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');
}
Run Code Online (Sandbox Code Playgroud)

只是一定要在你的html中添加脚本标签,否则片刻将不存在.

<script src="node_modules/moment/moment.js" />
Run Code Online (Sandbox Code Playgroud)

模块加载 moment

首先,您需要设置一个模块加载程序,如System.js,以加载当前的commonjs文件

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

然后将片刻导入需要使用的文件中

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

要么

import moment = require('moment');
Run Code Online (Sandbox Code Playgroud)

编辑:

还有一些捆绑包的选项,例如Webpack或SystemJS构建器或Browserify,它们可以保留窗口对象的瞬间.有关这些的更多信息,请访问他们各自的网站获取指导.

  • 这个答案具有误导性,即时刻是一个全局变量的事实并不意味着你"必须"将它作为脚本标签加载.如果您使用某种捆绑器(Webpack),您可以而且应该将其捆绑在供应商文件中.如果您使用webpack和正确的加载器,您还可以解决全局分配问题. (6认同)
  • 这是可能的,但是非常冗长,因为你需要在commonjs节点版本中有一个模块加载器,例如`System`加载,然后你就可以用`import*作为瞬间从'时刻'引用它; `或`import moment = require('moment');`这对于所有意图和目的是相同的,但在打字稿中确实有一些细微的差别. (3认同)
  • 这个答案是不完整的,因为您必须使用Typings来管理时刻定义.此外,它不需要导入任何东西.请参阅[我的回答](http://stackoverflow.com/a/38664689/1814934). (2认同)

Sti*_*ler 49

以下对我有用.

首先,暂时安装类型定义.

typings install moment --save

(注意:NOT --ambient)

然后,解决缺乏适当的出口:

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

  • 从'moment'开始'import {Moment};`为我工作. (5认同)
  • 这个答案是不完整的,因为您不需要导入任何东西.请参阅[我的回答](http://stackoverflow.com/a/38664689/1814934). (3认同)
  • 我必须做"从"时刻"导入时刻";"而不是让它起作用. (2认同)

小智 28

我会跟随以下内容:

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');


小智 25

我们现在正在使用模块,

尝试 import {MomentModule} from 'angular2-moment/moment.module';

npm install angular2-moment

http://ngmodules.org/modules/angular2-moment

  • 这是不够的,因为这只会安装管道.显然,您不能以这种方式使用模块中的Moment日期. (76认同)
  • 这应该是:从'angular2-moment/moment.module'导入{MomentModule}; (3认同)

Sha*_*zad 22

要在Typescript项目中使用它,您需要安装时刻:

npm install moment --save

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

import * as moment from "moment";


Ber*_*eco 14

---更新11/01/2017

分型现在已经过时,它是由替代NPM @types.从现在开始,获取类型声明除了npm之外不需要任何工具.要使用Moment,您不需要通过@types安装类型定义,因为Moment已经提供了自己的类型定义.

所以,它减少到只有3个步骤:

1 - 安装时刻,包括类型定义:

npm install moment --save
Run Code Online (Sandbox Code Playgroud)

2 - 在HTML文件中添加脚本标记:

<script src="node_modules/moment/moment.js" />
Run Code Online (Sandbox Code Playgroud)

3 - 现在你可以使用它.期.

today: string = moment().format('D MMM YYYY');
Run Code Online (Sandbox Code Playgroud)

---原始答案

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

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

typings install --save --global dt~moment dt~moment-node
Run Code Online (Sandbox Code Playgroud)

2 - 在HTML文件中添加脚本标记:

<script src="node_modules/moment/moment.js" />
Run Code Online (Sandbox Code Playgroud)

3 - 现在你可以使用它.期.

today: string = moment().format('D MMM YYYY');
Run Code Online (Sandbox Code Playgroud)


Rah*_*Ali 10

对于Angular 7+(也支持8)

1:通过命令安装时刻 npm install moment --save

2:请勿在 app.module.ts

3:只需在您component或其他任何文件的顶部添加import语句,如下所示:import * as moment from 'moment';

4:现在您可以moment在代码中的任何地方使用。就像:

myDate = moment(someDate).format('MM/DD/YYYY HH:mm');

  • 请注意 `import * as moment from 'moment';` 会使捆绑包的大小增加约 500kb。有一篇很好的文章解释了问题的解决方案 https://medium.jonasbandi.net/angular-cli-and-moment-js-a-recipe-for-disaster-and-how-to-fix-it-163a79180173 (2认同)

Whi*_*her 9

使用ng CLI

> npm install moment --save
Run Code Online (Sandbox Code Playgroud)

在app.module中

import * as moment from 'moment';

providers: [{ provide: 'moment', useValue: moment }]
Run Code Online (Sandbox Code Playgroud)

在组件中

constructor(@Inject('moment') private moment)
Run Code Online (Sandbox Code Playgroud)

这样你导入一次

UPDATE Angular => 5

{
   provide: 'moment', useFactory: (): any => moment
}
Run Code Online (Sandbox Code Playgroud)

对我来说,工作与aot和通用

我不喜欢使用任何但是使用时刻.我得到了

Error   Typescript  Type 'typeof moment' is not assignable to type 'Moment'. Property 'format' is missing in type 'typeof moment'.
Run Code Online (Sandbox Code Playgroud)


roy*_*ppa 8

angular2-moment库的管道类似于{{myDate | amTimeAgo}}在.html文件中使用.

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

npm install --save angular2-moment
Run Code Online (Sandbox Code Playgroud)

在node_modules/angular2-moment中,现在将是".pipe.d.ts"文件,如calendar.pipe.d.ts,date-format.pipe.d.ts等等.

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

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

import { DateFormatPipe } from "angular2-moment";
.....
providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, ...., DateFormatPipe]
Run Code Online (Sandbox Code Playgroud)

然后在要使用该函数的任何组件中,将其导入到顶部,注入构造函数并使用:

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

要使用任何功能,请遵循此过程.如果有一种方法可以访问所有功能,那将是很好的,但上述解决方案都不适合我.


jev*_*son 5

除了 SnareChop 的答案之外,我还必须更改 momentjs 的打字文件。

moment-node.d.ts我替换:

export = moment;
Run Code Online (Sandbox Code Playgroud)

export default moment;
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您可以添加更多第三方软件包,我使用了angular2-moment库.安装非常简单,您应该遵循README的最新说明.由于这个原因,我也安装了打字机.

对我来说就像一个魅力,几乎没有添加任何代码来使它工作.


Ast*_*ten 5

不确定这对于人们来说是否还是一个问题,但是...使用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;
Run Code Online (Sandbox Code Playgroud)

对我来说工作得很好.


Arn*_*son 5

对于angular2 RC5,这对我有用......

首先通过npm安装时刻

npm install moment --save
Run Code Online (Sandbox Code Playgroud)

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

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

最后在systemjs.config.js"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'}
  };
Run Code Online (Sandbox Code Playgroud)


Vad*_*aka 5

我自己在 Angular 中使用 Moment 的版本

npm i moment --save

import * as _moment from 'moment';

...

moment: _moment.Moment = _moment();

constructor() { }

ngOnInit() {

    const unix = this.moment.format('X');
    console.log(unix);    

}
Run Code Online (Sandbox Code Playgroud)

首先将 moment 导入为_moment,然后声明moment类型_moment.Moment为初始值为 的变量_moment()

普通导入 moment 不会为您提供任何自动完成功能,但如果您使用调用的 moment命名空间初始化的包中的命名空间Moment中的类型接口来声明 moment ,则可以自动完成 moment 的 api。_moment'moment'_moment()

@types typings我认为,如果您正在寻找像 moment 这样的普通 javascript 库的自动完成功能,那么这是在不使用或 Angular 提供程序的情况下使用 moment 的最有角度的方式。