我无法为" thingspeakclient"创建类型定义文件。图书馆

时间:2018-01-15 20:34:50

标签: typescript

在我的带有express的node / typescript项目中,我想使用thingspeakclient包。该软件包没有任何现有的类型定义文件,所以我决定写一个(我第一次)。

我有什么:

  1. 创建文件夹src/@types/thingspeakclient
  2. 使用以下内容创建文件index.d.ts

        declare module "thingspeakclient";
        declare interface TSCKeys {
            writeKey: string;
            readKey: string;
        }
        declare class ThingSpeakClient {
            constructor(opts: any);
            attachChannel(channelId: number, keys: TSCKeys, callback: Function): void;
        }
        
  3. 现在,在任何带有例如import * as TSC from "thingspeakclient";的TS文件中,我想使用这样的东西: var a = new TSC.ThingSpeakClient();

    但是在运行时我看到了这个错误: 的 TypeError: TSC.ThingSpeakClient is not a constructor

    现在,我想使用这个1功能,是的,这个软件包非常简单 - 所以我没有问题重新写入TS,但我想学习如何编写有效的类型定义......

    有没有人可以告诉我我做错了什么?

    更新1: 我做了一个由cevek建议的改变,但它仍然没有工作:

    用法:

        import {ThingSpeakClient} from "thingspeakclient";
        var a = new ThingSpeakClient({});

    转换为此Javascript:

        var thingspeakclient_1 = require("thingspeakclient");
        var a = new thingspeakclient_1.ThingSpeakClient({});

    但问题是,当这个JS包直接在JS中使用时,它必须像那样使用(注意 - 没有'命名空间'):

        var tsc = require("thingspeakclient");
        var a = new tsc({});
    < p>

    你可以看到,require中返回的对象直接用作类......

    只是为了清晰 - thingspeakclient 包的原始简化 JS代码:

    
        var ThingSpeakClient = function(opts) {
          //constructor
        };
    
        ThingSpeakClient.prototype.attachChannel = function(channelId, keys, callback) { }
        // next function definitions...
        // next ...
        // and at the end of file:
        module.exports = ThingSpeakClient;
    
    

    全班在这里: https://github.com/imwebgefunden/thingspeakclient_node/blob/master/thingspeakclient.js

2 个答案:

答案 0 :(得分:0)

只需将your module放入您的类和接口

即可
declare module 'thingspeakclient' {
    export interface TSCKeys {
        writeKey: string;
        readKey: string;
    }
    export default class ThingSpeakClient {
        constructor(opts: any);
        attachChannel(channelId: number, keys: TSCKeys, callback: Function): void;
    }
}

import ThingSpeakClient from "thingspeakclient";
var a = new ThingSpeakClient();

答案 1 :(得分:0)

另一种方法,如果你真的想要使用commonjs module pattern

declare namespace TSC {
    export interface TSCKeys {
        writeKey: string;
        readKey: string;
    }
    export class ThingSpeakClient {
        constructor(opts: any);
        attachChannel(channelId: number, keys: TSCKeys, callback: Function): void;
    }    
}


declare module 'thingspeakclient' {
    import ThingSpeakClient = TSC.ThingSpeakClient;
    export = ThingSpeakClient;
}

import * as ThingSpeakClient from "thingspeakclient";
var a = new ThingSpeakClient(1);