我目前正在将我的项目从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' "
那么我应该为这个例子使用什么输入?
答案 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)