在具有签名的情况下,无法调用其类型缺少调用签名的表达式

时间:2017-05-01 23:01:53

标签: typescript typescript-typings

我正在尝试通过npm为我安装的模块定义类型。

这是exported module。我宁愿不对这个文件进行更改,因为我想在不引入BC的情况下合并回原始仓库

/**
 * Given a number, return a zero-filled string.
 * From http://stackoverflow.com/questions/1267283/
 * @param  {number} width
 * @param  {number} number
 * @return {string}
 */
module.exports = function zeroFill (width, number, pad) {
  if (number === undefined) {
    return function (number, pad) {
      return zeroFill(width, number, pad)
    }
  }
  if (pad === undefined) pad = '0'
  width -= number.toString().length
  if (width > 0) return new Array(width + (/\./.test(number) ? 2 : 1)).join(pad) + number
  return number + ''
}

这是我为this file

写的定义
declare module "zero-fill"{
    export default function zeroFill(width:number, num:number, pad?:string|number):string;
    export default function zeroFill(width:number):{(num:number, pad?:string|number):string};
}

以下是一个示例用法:

import * as zeroFill from "zero-fill";
zeroFill(2,0);

令我困惑的是,编译器都给了我这个错误:

Cannot invoke an expression whose type lacks a call signature. Type 'typeof "zero-fill"' has no compatible call signatures.

同时它编译打字稿,我看到它在浏览器中运行。什么似乎是问题?

2 个答案:

答案 0 :(得分:0)

当你import * as zeroFill实际上你正在命名模块本身时为零填充。要调用该函数,您必须转到zeroFill.zeroFill(2, 0),其中第一个zeroFill是导入别名,第二个zeroFill是函数。

答案 1 :(得分:0)

以下是I ended up doing

定义:

declare module "zero-fill" {
    function zeroFill(width:number, num:number, pad?:string|number):string
    function zeroFill(width:number):{(num:number, pad?:string|number):string}
    export  = zeroFill
}

用法:

import zeroFill = require("zero-fill")
zeroFill(4, 1) // '0001'
zeroFill(10, 55) // '0000000055'
zeroFill(1, 1) // '1'