【问题标题】:TypeScript Compiler: @types/d3-tip - Cannot invoke an expression whose type lacks a call signatureTypeScript 编译器:@types/d3-tip - 无法调用类型缺少调用签名的表达式
【发布时间】:2017-04-16 00:10:15
【问题描述】:

我正在尝试理解此错误,阅读所有带有类似错误消息的问题,但找不到任何帮助。

我对 TypeScript 还很陌生,但我已经到了那里。我正在尝试包含与 d3 一起使用的 d3-tip 模块。我安装了@types/d3 和@types/d3-tip。现在我的代码看起来像这样

import * as d3 from 'd3';
import * as d3Tip from 'd3-tip';
console.log(d3Tip) // => print the function signature from d3-tip module
console.log(d3Tip()) 
// => results in error 'Cannot invoke an expression whose type lacks a call signature'
d3.tip = d3Tip 
// => results in error 'Property 'tip' does not exist on type 'typeof "<my-project-path>/node_modules/@types/d3/index"''

我认为我有两个问题:首先,我无法调用 d3-tip 方法,我真的不明白为什么如果有人可以向我解释那会很棒。
其次,我不能将 d3Tip 函数作为 d3 对象的新属性附加(这是我以前用 ES6 做的,效果很好),然后用d3.tip() 创建一个提示。

我知道我可以找到其他解决方案,例如自己设计提示(可能花费的时间更少^^),但我更愿意了解如何解决这个问题。

有什么想法吗?

【问题讨论】:

    标签: javascript d3.js typescript typescript-typings


    【解决方案1】:

    好问题。最初我使用npm install @types/d3-tip 安装。然后我需要将./node_modules/@types/d3-tip/index.d.ts 复制到./d3-tip.d.ts。现在下面的代码可以工作了:

    import * as d3 from "d3";
    import "./d3-tip";
    
    d3.tip().hide();
    let arc = d3.arc();
    

    因此d3-tip.d.ts 中的声明会根据需要合并到 d3 命名空间中。为什么不复制就不行,我不知道。有什么帮助吗?

    【讨论】:

    • 我明天试试这个,但你的解决方案似乎有道理!我会在工作测试后立即验证:-)
    • Erf,无法让它工作:当我 import "./d3-tip" 时,webpack 抛出一个错误,说它找不到文件(我确实将 index.d.ts 复制到了与组件,将其重命名为 d3-tip.d.ts)。当我尝试import "./d3-tip.d" 时,构建失败......我猜问题来自 Webpack 及其模块系统:-/
    猜你喜欢
    • 2015-08-26
    • 2017-09-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2019-09-10
    • 2018-12-25
    相关资源
    最近更新 更多