由于“没有兼容的呼叫签名”,因此无法在打字稿中使用类名

时间:2019-02-03 07:53:27

标签: typescript

运行相关的yarn add命令之后,以下是packages.json中的新行:

"@types/classnames": "^2.2.7",
"classnames": "^2.2.6",

然后我将这些行添加到我的打字稿文件中:

import * as classnames from 'classnames';
...
            <div className={classnames('normal', 'on')}>

现在我收到此错误

  

类型错误:无法调用类型缺少调用签名的表达式。输入'{默认值:ClassNamesExport; }'不兼容   呼叫签名。 TS2349

我的tsconfig.json

的内容
{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "preserve",
    "experimentalDecorators": true
  },
  "include": [
    "src"
  ]
}

如何解决此错误?

2 个答案:

答案 0 :(得分:1)

尝试按以下方式进行操作

import classnames from 'classnames';

import {default as classnames} as 'classnames';

如果它们都不起作用,请检查您要使用的模块的package.json是否具有“ main”或“ module”字段。如果没有,那也许可以解释该错误。

答案 1 :(得分:1)

执行import * as X from 'x'时,您将获得一个模块名称空间对象。这是一个不可变的对象,不能调用。

由于classnames是commonjs模块,因此您需要在esModuleInterop: true中设置tsconfig.json并执行import classnames from 'classnames'

,或者您可以使用旧的语法import classnames = require('classnames')导入它。

建议使用esModuleInterop