【问题标题】:How to fix "TS2349: Cannot invoke an expression whose type lacks a call signature"如何修复“TS2349:无法调用类型缺少调用签名的表达式”
【发布时间】:2016-03-30 08:32:12
【问题描述】:

DefinitelyTyped 库:

declare module "history/lib/createBrowserHistory" 
{
    export default function createBrowserHistory(options?: HistoryModule.HistoryOptions): HistoryModule.History
}

这样使用时会在标题中出现编译错误(尽管在转换为 .tsx 之前它在普通的旧 .jsx 中工作):

import React = require('react');
import reactDom = require('react-dom');
import ReactRouter = require('react-router');
import createBrowserHistory = require('history/lib/createBrowserHistory');
import routes = require('app/tools/routes');

export function createReactApp() : void
{
    let history = createBrowserHistory(); // <-- error :(
    reactDom.render
    (
        <ReactRouter.Router history={history}>{routes}</ReactRouter.Router>,
        document.getElementById('app')
    );
}

我做错了什么?

【问题讨论】:

    标签: reactjs typescript definitelytyped


    【解决方案1】:

    如果您遇到问题,可能是由于 Babel 编译的那个版本与 TypeScript 导入不兼容。

    请尝试像这样导入它:

    import { createBrowserHistory } from 'history';
    

    【讨论】:

      【解决方案2】:

      您尝试使用的模块是 ES6 模块,因此您必须使用 ES6 语法导入它:

      import createBrowserHistory from 'history/lib/createBrowserHistory';
      

      或者,您可以使用旧的 import = 语法并访问导出对象的 default 属性,而不是默认导出(但您不应该;使用 ES6 导入!)。

      【讨论】:

      • 现在可以编译,但在浏览器中出现错误:Uncaught TypeError: createBrowserHistory_1.default is not a function
      • 那你在运行时使用/加载了错误的库或者错误的库版本,或者你使用的d.ts文件是错误的。
      • 那么有没有办法以某种方式覆盖定义或模块(就像 CSS 框架允许的那样)?我不想停止引用此定义文件,因为它适用于除此之外的定义,并且在我下次更新外部引用时更改它将不起作用。
      • 您不能覆盖声明,但可以将同名的声明合并在一起。但是,DefinitelyTyped 是开源的,所以你为什么不直接提交一个包含对定义文件的修复的拉取请求呢? OSS 不应该是免费的午餐——它只有在每个人的帮助下才能发挥作用。
      • 我已经为其他一些人做到了。但我不知道如何解决这个问题。实际上,我几乎在我使用过的每个 DT 模块中都发现了错误。我想我只需将我所有的外部库设置为 并为自己省去麻烦。
      猜你喜欢
      • 2020-02-07
      • 2023-03-20
      • 2017-10-11
      • 2020-05-17
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2017-12-19
      相关资源
      最近更新 更多