定义导出单个函数的非类型化模块的类型

时间:2018-01-28 12:08:52

标签: javascript typescript

我在TypeScript项目中使用parse-diffparse-diff不包含类型定义,因此我开始编写自己的类型。

它导出一个函数,如下所示:

exports = function () { /* ... */ }

我将它包含在脚本中:

import * as parse from 'parse-diff';

我通过声明一个模块让定义工作。这是我到目前为止所得到的:

declare module 'parse-diff' {

  interface Change {
    type: string;
    normal: boolean;
    ln1: number;
    ln2: number;
    content: string;
  }

  interface Chunk {
    content: string;
    changes: Change[];
    oldStart: number;
    oldLines: number;
    newStart: number;
    newLines: number;
  }

  interface File {
    chunks: Chunk[];
    deletions: number;
    additions: number,
    from: string,
    to: string,
    index: string[]
  }

  function parse(diff: string): File[];

  namespace parse {}
  export = parse;
}

这很好用。现在的问题是我无法弄清楚如何在其他地方导入和使用各个接口。

如果我从包中导入它们,我会收到错误:

  

“parse-diff”没有导出成员“文件”

如果我export模块中的接口,我必须export default parse函数。这样我就得到了错误:

  

无法调用类型缺少调用签名的表达式。类型'typeof'parse-diff''没有兼容的呼叫签名。

我无法弄清楚如何保持模块的“只有一个导出”特性并使用内部接口。

1 个答案:

答案 0 :(得分:2)

编辑命名空间并在其中声明接口

declare module "parse-diff" {
  function parse(diff: string): parse.File[];

  namespace parse {
    interface Change {
      type: string;
      normal: boolean;
      ln1: number;
      ln2: number;
      content: string;
    }

    interface Chunk {
      content: string;
      changes: Change[];
      oldStart: number;
      oldLines: number;
      newStart: number;
      newLines: number;
    }

    interface File {
      chunks: Chunk[];
      deletions: number;
      additions: number;
      from: string;
      to: string;
      index: string[];
    }
  }
  export = parse;
}