我正在尝试让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"
]
}
答案 0 :(得分:4)
在您的情况下,您要在其中导入的内容所有库将作为名为moment
的对象导出。显然,该对象没有编译器指出的呼叫签名。
根据库附带的type definitions, 默认导出是您要使用的力矩函数。
因此,将导入更改为以下内容应该可行:
import moment from 'moment';
答案 1 :(得分:3)
我有同样的问题。我用两种方法解决了这个问题。
1)我在compilerOptions下设置esModuleInterop的值 false
"esModuleInterop": false
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