无法使用moment调用类型缺少呼叫签名的表达式

时间:2019-03-08 20:36:35

标签: angular typescript momentjs

我正在尝试让moment在我的angular应用程序中工作。这是一个干净的示例repo,以演示此问题。克隆该仓库并在根目录中运行ng build test-library。首先安装软件包npm install

当我尝试使用moment时,出现以下错误。我究竟做错了什么?我已经尝试修复此问题已有一段时间了。我已经在Google上搜索了很多遍,并尝试了一些建议都没有用。

用法:

import * as moment from 'moment';

...

  public doSomething(): string {
    const aMoment: moment.Moment = moment(); // line 22
    return aMoment.format();
  }

错误:

projects/test-library/src/lib/test-library.component.ts(22,36): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'typeof moment' has no compatible call signatures.

tsconfig.json

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "outDir": "../../out-tsc/lib",
    "target": "es2015",
    "module": "es2015",
    "moduleResolution": "node",
    "declaration": true,
    "sourceMap": true,
    "inlineSources": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "types": [],
    "lib": [
      "dom",
      "es2018"
    ]
  },
  "angularCompilerOptions": {
    "annotateForClosureCompiler": true,
    "skipTemplateCodegen": true,
    "strictMetadataEmit": true,
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true,
    "enableResourceInlining": true
  },
  "exclude": [
    "src/test.ts",
    "**/*.spec.ts"
  ]
}

4 个答案:

答案 0 :(得分:4)

在您的情况下,您要在其中导入的内容所有库将作为名为moment的对象导出。显然,该对象没有编译器指出的呼叫签名。

根据库附带的type definitions, 默认导出是您要使用的力矩函数。

因此,将导入更改为以下内容应该可行:

import moment from 'moment';

答案 1 :(得分:3)

我有同样的问题。我用两种方法解决了这个问题。

1)我在compilerOptions下设置esModuleInterop的值 false

"esModuleInterop": false

  1. 第二种更改代码的方式

import * as _moment from 'moment';

转到以下代码

import _moment from "moment";

两个选项对我的代码都适用。

答案 2 :(得分:1)

就我而言

esModuleInterop:true

tsconfig.json中有

删除此行后,问题得到解决。

答案 3 :(得分:0)

当Typescript编译器找不到正在使用的方法的类型定义时,会发生这种情况。 您需要安装 @ types / moment 作为依赖项。

npm i -D @types/moment