在TypeScript中使用MomentJS - moment()有什么类型?

时间:2017-07-18 15:32:12

标签: typescript momentjs

我目前正在将我的项目从ES5转换为ES6,但我遇到了MomentJS(version 2.18.1)的问题。问题是我有一些变量是Moment对象,但是我不能在它们上面调用moment()。

一个例子:

    import * as moment from "moment";
    export class DateThingy{

        constructor(private moment) { //What type does this have??
        }

        public getDate(): moment.Moment { 
           return this.moment();
        }
    }

1)如果我将private moment的类型设置为private moment: moment WebStorm投诉:" 找不到姓名'时刻'。&# 34;

2)如果我将类型设置为private moment: moment.Moment,则对象已更改,我不能再调用this.moment()(它现在是一个对象,并且没有函数调用)。 Webstorm告诉我:" 无法调用类型缺少调用签名的表达式。类型'时刻'没有可以召集的电话签名。"

3)我不能再使用MomentStatic,因为它不会被导出。如果我输入private moment: moment.MomentStatic,WebStorm会给我:" 命名空间'时刻'没有出口会员' MomentStatic' "

那么我应该为这个例子使用什么输入?

4 个答案:

答案 0 :(得分:38)

Mike McCaughan所述,时刻对象不能在构造函数中注入。不知何故,这可能是旧版本的MomentJS。这可以通过删除构造函数属性并访问通过import * as moment from "moment"包含的全局矩对象来解决。

函数moment()返回Moment个对象。这可以通过moment.Moment输入。

所以代码可以按如下方式重写:

import * as moment from "moment";

export class DateThingy{

     constructor() {
     }

     public getDate(): moment.Moment { 
        return moment();
     }
}

答案 1 :(得分:7)

您尝试导入不带别名的时刻吗?

import moment from 'moment';

这对我有用。而且打字稿编译器不会对此抱怨。

const date = moment().format('YYYYMMDD');

请注意,这需要更新tsconfig!

在TSConfig中,您需要添加选项allowSyntheticDefaultImports,以允许默认导入没有默认导出的库。

示例(tsconfig.json):

{
  "compileOnSave": false,
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
  }
}

答案 2 :(得分:0)

您可以像这样导入和使用瞬间输入:

import moment, { Moment } from "moment";

const timeNow: Moment = moment();

答案 3 :(得分:-1)

我收到了这样的错误消息

无法调用类型缺少调用签名的表达式。类型'typeof moment'没有兼容的呼叫签名。

我的问题是使用别名导入

从*时刻开始导入*;

我将其更改为

从“时刻”开始导入时刻;

为我解决了8号角(TypeScript 2.4)