【问题标题】:I can't create a type definition file for "thingspeakclient" library我无法为“thingspeakclient”库创建类型定义文件
【发布时间】:2018-06-24 12:23:04
【问题描述】:

在我的 node/typescript 项目中,我想使用 thingspeakclient 包。该包没有任何现有的类型定义文件,因此我决定编写一个(这是我第一次)。

我有什么:

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

    声明模块“thingspeakclient”; 声明接口 TSCKeys { 写键:字符串; 读键:字符串; } 声明类 ThingSpeakClient { 构造函数(选择:任何); attachChannel(channelId: number, keys: TSCKeys, callback: Function): void; }

现在,在任何带有 import * as TSC from "thingspeakclient"; 的 TS 文件中,我想使用这样的东西: var a = new TSC.ThingSpeakClient();

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

现在,我只想使用这 1 个函数,是的,这个包真的很简单 - 所以我没有问题将它重写到 TS,但是 我想学习如何编写有效的类型定义...

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

更新 1: 我做了 cevek 建议的更改,但它仍然不起作用:

用法:

 从“thingspeakclient”导入 {ThingSpeakClient};
    var a = new ThingSpeakClient({});

被转换成这个Javascript:

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

但问题是,当这个JS包直接在JS中使用时,必须这样使用(注意-没有'namespace'):

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

可以看到,require返回的对象是直接作为类使用的...

只是为了清楚起见 - thingspeakclient 包的原始 simplified JS 代码:

var ThingSpeakClient = 功能(选择){ //构造函数 }; ThingSpeakClient.prototype.attachChannel = function(channelId, keys, callback) { } // 下一个函数定义... // 下一个 ... // 并在文件末尾: module.exports = ThingSpeakClient;

完整课程在这里: https://github.com/imwebgefunden/thingspeakclient_node/blob/master/thingspeakclient.js

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果你真的想使用另一种方法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);
    

    【讨论】:

      【解决方案2】:

      把你的类和接口放在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();
      

      【讨论】:

      • 谢谢,不幸的是它不起作用:-(我做了你建议的改变,VS代码开始显示“适当的”智能感知等等。但生成的JS代码看起来仍然很糟糕:var thingspeakclient_1 = require("thingspeakclient"); var a = new thingspeakclient_1.ThingSpeakClient({});
      • 添加default - export default class ThingSpeakClientimport ThingSpeakClient from "thingspeakclient"; new ThingSpeakClient()
      • 我尝试添加 default - 但它不起作用 - VSC 开始抱怨 A default export can only be used in an ecmascript-style module。所以我删除了它。取而代之的是,我只是使用了另一个“导入”命令 - import ThingSpeakClient = require("thingspeakclient"); 一个很好用的!所以谢谢你!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多