【问题标题】:using MomentJS with TypeScript - What type does moment() have?使用 MomentJS 和 TypeScript - moment() 有什么类型?
【发布时间】:2017-12-23 14:03:13
【问题描述】:

我目前正在将我的项目从 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 会报错:“找不到名称'moment'。

2) 如果我将类型设置为private moment: moment.Moment,则对象已更改,我不能再调用this.moment()(它现在是一个对象并且没有函数调用)。 Webstorm 告诉我:“无法调用类型缺少呼号的表达式。类型 'Moment' 没有可兼容的呼号。

3) 我不能再使用 MomentStatic,因为它没有被导出。如果我输入 private moment: moment.MomentStaticWebStorm 会给我:“命名空间 'moment' 没有导出的成员 'MomentStatic'

那么在这个例子中我应该使用什么类型呢?

【问题讨论】:

  • 您在标题中说“ES6”,但看起来您实际上是在使用 TypeScript(来自代码和标签)。你应该使用#2,会有一个全局的moment你可以使用,比如getDate(): moment.Moment { return moment(); }
  • 检查moment.d.ts。顺便说一句,moment 是命名空间,而不是类型。
  • @MikeMcCaughan,你是对的。改了标题。但我不明白你的回答。如果我添加 moment.Moment als 打字,我会得到“无法调用类型缺少呼号的表达式”。那么全局是什么意思?
  • @torazaburo,没错。 moment 也是一个函数 (declare function moment(): moment.Moment)。但是我想知道如何键入变量以便可以在其上调用该函数? (moment 在它的接口上有一个函数(),但我似乎不能给变量类型moment
  • 您正在寻找moment.Moment

标签: typescript momentjs


【解决方案1】:

正如Mike McCaughan 所说,moment 对象不能被注入到构造函数中。不知何故,这在旧版本的 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();
     }
}

【讨论】:

    【解决方案2】:

    您是否尝试过导入不带别名的时刻?

    import moment from 'moment';

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

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

    请注意,这需要更新 tsconfig!

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

    示例(tsconfig.json):

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

    【讨论】:

    • 它说; moment 没有默认导出;即使如此,它也修复了下一个错误:error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'typeof moment' has no compatible call signatures.
    • @Kunok,您需要将 "allowSyntheticDefaultImports": true (typescriptlang.org/docs/handbook/compiler-options.html) 添加到 tsconfig.json 以便能够在 typescript 中以这种方式使用没有默认导出的库。
    【解决方案3】:

    我收到这样的错误消息

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

    我的问题是使用别名导入

    import * as momentns from 'moment';

    我把它改成了

    从“时刻”导入时刻;

    在 Angular 8(TypeScript 2.4) 中为我解决了

    【讨论】:

    • 重复答案
    【解决方案4】:

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

    import moment, { Moment } from "moment";
    
    const timeNow: Moment = moment();
    

    【讨论】:

    • 这应该是公认的答案。为什么这个答案得票这么少?
    • 我一直在问自己,@NelsonTeixeira
    • @NelsonTeixeira 我同意
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2018-12-10
    • 1970-01-01
    • 2021-08-01
    • 2016-07-11
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多