我尝试将它与typescript绑定一起使用:
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()时,我收到一个错误。 应该很简单,任何人都可以提供一个可以工作的命令行/导入组合吗?
答案 0 :(得分:429)
2017年4月更新:
从版本2.13.0开始,Moment包含一个打字稿定义文件。 https://momentjs.com/docs/#/use-it/typescript/
只需在控制台类型
中使用npm安装它npm install --save moment
然后在你的Angular应用程序中,导入就像这样简单:
import * as moment from 'moment';
就是这样,你得到完整的打字稿支持!
奖励编辑:要在Typescript中键入变量或属性Moment
,您可以执行此操作,例如:
let myMoment: moment.Moment = moment("someDate");
答案 1 :(得分:96)
moment
是第三方全球资源。时刻对象位于浏览器中的window
。因此,在angular2应用程序中import
它是不正确的。而是在html中包含将加载moment.js文件的<script>
标记。
要使TypeScript满意,您可以添加
declare var moment: any;
位于文件顶部,用于停止编译错误,或者您可以使用
///<reference path="./path/to/moment.d.ts" />
或使用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');
}
请确保在您的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'
}
}
});
然后将片刻导入需要使用的文件
import * as moment from 'moment';
或
import moment = require('moment');
编辑:
还有一些捆绑包的选项,例如Webpack或SystemJS构建器或Browserify,它们可以保留窗口对象的瞬间。有关这些的更多信息,请访问各自的网站以获取指导。
答案 2 :(得分:49)
以下对我有用。
首先,暂时安装类型定义。
typings install moment --save
(注意:不是--ambient
)
然后,解决缺乏适当出口的问题:
import * as moment from 'moment';
答案 3 :(得分: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');
答案 4 :(得分:25)
我们现在正在使用模块,
尝试import {MomentModule} from 'angular2-moment/moment.module';
npm install angular2-moment
之后
答案 5 :(得分:22)
要在Typescript
项目中使用它,您需要安装时刻:
npm install moment --save
安装片刻后,您可以在导入后在任何.ts
文件中使用它:
import * as moment from "moment";
答案 6 :(得分:14)
---更新11/01/2017
打字现已弃用,已被 npm @types 取代。从现在开始,获取类型声明除了npm之外不需要任何工具。要使用Moment,您不需要通过 @types 安装类型定义,因为Moment已经提供了自己的类型定义。
所以,它只减少到3个步骤:
1 - 安装包含类型定义的时刻:
<script src="node_modules/moment/moment.js" />
2 - 在HTML文件中添加脚本标记:
today: string = moment().format('D MMM YYYY');
3 - 现在你可以使用它。周期。
typings install --save --global dt~moment dt~moment-node
---原始回答
只需3个步骤即可完成:
1 - 安装时刻定义 - *。d.ts 文件:
<script src="node_modules/moment/moment.js" />
2 - 在HTML文件中添加脚本标记:
today: string = moment().format('D MMM YYYY');
3 - 现在你可以使用它。周期。
List<String> arr = Arrays.asList(IMGS);
Collections.shuffle(arr);
IMGS = arr.toArray(IMGS);
答案 7 :(得分:9)
使用ng CLI
> npm install moment --save
app.module中的
import * as moment from 'moment';
providers: [{ provide: 'moment', useValue: moment }]
组件中的
constructor(@Inject('moment') private moment)
这样你导入一次
更新 Angular =&gt; 5
{
provide: 'moment', useFactory: (): any => moment
}
对我来说,工作是为了刺激 还有通用的
我不喜欢使用任何但使用时刻.Moment 我得到了
Error Typescript Type 'typeof moment' is not assignable to type 'Moment'. Property 'format' is missing in type 'typeof moment'.
答案 8 :(得分:8)
angular2-moment库的管道类似于{{myDate | amTimeAgo}}在.html文件中使用。
这些相同的管道也可以作为组件类(.ts)文件中的Typescript函数进行访问。首先按照说明安装库:
npm install --save angular2-moment
在node_modules / angular2-moment中,现在将是&#34; .pipe.d.ts&#34;文件如 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]
然后在你想要使用该函数的任何组件中,将其导入顶部,注入构造函数并使用:
import { DateFormatPipe } from "angular2-moment";
....
constructor(......., public dfp: DateFormatPipe) {
let raw = new Date(2015, 1, 12);
this.formattedDate = dfp.transform(raw, 'D MMM YYYY');
}
要使用任何功能,请遵循此过程。如果有一种方法可以访问所有功能,那将是很好的,但上述解决方案都不适用于我。
答案 9 :(得分:5)
对于angular2 RC5,这对我有用......
首先通过npm安装时刻
npm install moment --save
然后导入要使用它的组件中的时刻
import * as moment from 'moment';
最后在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'}
};
答案 10 :(得分:5)
对于 Angular 7 + :
1:通过命令npm install moment --save
2:请勿在{{1}}
中添加任何内容 3:只需在app.module.ts
或诸如此类的其他任何文件的顶部添加导入语句:component
4:现在您可以在代码中的任何地方使用import * as moment from 'moment';
。就像:
moment
答案 11 :(得分: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;
从那里为我工作正常。
答案 12 :(得分:5)
如果您可以添加更多第三方软件包,我使用了angular2-moment库。安装非常简单,您应该遵循README的最新说明。我也安装了typings。
对我来说就像一个魅力,并且几乎没有添加任何代码来使它工作。
答案 13 :(得分:4)
Moment.js现在支持v2.14.1中的TypeScript。
答案 14 :(得分:4)
除了SnareChop的回答之外,我还得更改了momentjs的打字文件。
在moment-node.d.ts
我替换了:
export = moment;
与
export default moment;
答案 15 :(得分:3)
尝试将"allowSyntheticDefaultImports": true
添加到tsconfig.json
。
这基本上告诉TypeScript编译器可以使用ES6 import语句,i。即
import * as moment from 'moment/moment';
在像Moment.js这样的CommonJS模块上,它没有声明默认导出。该标志仅影响类型检查,而不影响生成的代码。
如果您使用SystemJS作为模块加载器,则必须使用它。如果告诉TS编译器您使用SystemJS,该标志将自动打开:
"module": "system"
如果将IDE配置为使用tsconfig.json
,则还会删除IDE引发的任何错误。
答案 16 :(得分:3)
我自己在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);
}
首次导入时间为_moment
,然后声明moment
变量,其类型为_moment.Moment
,初始值为_moment()
。
简单导入的时刻不会给你任何自动完成但是如果你将从Moment
命名空间_moment
的{{1}}接口声明时刻'moment'
包初始化时调用了时刻命名空间{{1}给你自动完成时刻的api。
我认为这是在不使用_moment()
@types
或角度提供程序的情况下使用时刻的最有角度的方式,如果你正在寻找像香草javascript库那样的自动完成时刻。
答案 17 :(得分:2)
必须这样做:
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();
答案 18 :(得分:2)
对于ANGULAR CLI用户
使用外部库在此处的文档中:
https://github.com/angular/angular-cli/wiki/stories-third-party-lib
只需通过
安装您的图书馆npm install lib-name --save
并将其导入您的代码中。如果图书馆不包括打字, 你可以使用以下方法安装它们:
npm install lib-name --save
npm install @ types / lib-name --save-dev
然后打开src / tsconfig.app.json并将其添加到types数组中:
“types”:[“lib-name”]
如果您添加的文字库仅用于您的e2e 测试,而是使用e2e / tsconfig.e2e.json。单元测试也是如此 和src / tsconfig.spec.json。
如果库在@ types /中没有可用的类型,则可以 仍然通过手动添加打字机来使用它:
首先,在src /文件夹中创建一个typings.d.ts文件。
此文件将自动包含为全局类型定义。 然后,在src / typings.d.ts中,添加以下代码:
声明模块'typeless-package';
最后,在使用该库的组件或文件中,添加 以下代码:
从'typeless-package'导入*作为typelessPackage; typelessPackage.method();
完成。注意:您可能需要或找到有用的定义更多的类型 您尝试使用的库。
答案 19 :(得分:1)
使用systemjs我所做的是,在我的systemjs.config中我添加了moment
的地图
map: {
.....,
'moment': 'node_modules/moment/moment.js',
.....
}
然后您只需执行
即可轻松导入moment
import * as moment from 'moment'
答案 20 :(得分:1)
我知道这是一个旧线程,但对我来说,实际工作的最简单的解决方案是:
npm install moment --save
const moment = require('../../../node_modules/moment/moment.js');
@Component({...})
export class MyComponent {
...
ngOnInit() {
this.now = moment().format();
}
...
}
答案 21 :(得分:1)
以下对我有用:
typings install dt~moment-node --save --global
在typings存储库中不存在moment-node。您需要重定向到Definitely Typed才能使用前缀dt。
使其工作答案 22 :(得分:0)
我遵循建议允许allowSyntheticDefaultImports(因为从我那里开始没有导出),使用System。然后我按照别人的建议使用:
import moment from 'moment';
在我的system.js配置中映射时刻。由于某种原因,其他导入语句对我不起作用