如何在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
上生存。 因此, import
它import
到您的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.ts , date-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实际上是:
- 首先
npm install moment --save
- 在我的组件需要从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声明不适用于我,出于某种原因