【问题标题】:Declaration file for class-module (TypeScript)类模块的声明文件(TypeScript)
【发布时间】:2017-03-23 15:16:44
【问题描述】:

我使用了一个没有通过打字找到并且在definelytyped中不存在的节点模块。

模块的基本用途是:

import * as SomeClass from 'some-module';

var someObject = new SomeClass("some string");
someObject.someMethod();

如您所见,此模块导出一个类作为其默认值。我还没想好怎么写它的声明文件。

这是我能做到的最好的:

declare module 'some-module' {
    export default class SomeClass {
        constructor (someArg: string);
        someMethod(): void;
    }
}

顺便说一句,它确实适用于 JavaScript。只是 TypeScript 困扰着我。

有什么办法解决这个问题吗?

【问题讨论】:

  • 您是否将代码转换为 es5?如果你这样做,那么我建议你改用import SomeClass = require('some-module')....长话短说

标签: javascript node.js typescript


【解决方案1】:

对于声明,你需要这样做:

declare module 'some-module' {
    class SomeClass {
        constructor (someArg: string);
        someMethod(): void;
    }
    namespace SomeClass {}
    export = SomeClass;
}

更新:感谢 Blake Embrey 指出,需要 hack namespace SomeClass {} 才能使其正常工作。 请参阅https://github.com/Microsoft/TypeScript/issues/5073 了解更多详情。

【讨论】:

  • 它会产生错误:'TS2497: Module '"some-module"' 解析为非模块实体,无法使用此构造导入。在导入语句上。我转译为 ES6 BTW。
  • 你需要把它放在一个单独的文件中。不在具有顶级导入/导出的文件中。将其保存为 custom-typings/some-module.d.ts 并将其包含在您的 tsconfig.json 中。
  • 是应用还是包?
  • 拍摄,似乎在 2.2 中发生了一些变化,这不再起作用。需要自己弄清楚替代方案是什么。
  • 它在一个单独的文件中。我已经创建了一些声明文件。我知道该怎么做。这只是一个特例,因为它有一个默认导出,即一个类。
【解决方案2】:

如果您只是想避免 TypeScript 错误并且不担心 ItelliSense,只需在文件开头声明您的类库,例如:

declare var SomeClass: any;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-06
    • 2015-11-22
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多