第三方类的类型定义

时间:2016-04-04 09:04:07

标签: typescript

我有一个名为canJS的第三方库。 有这个can.Map模块。这个模块是用AMD编写的。你可以用依赖加载器加载它,例如requirejs。

使用can.Map我们提供了两种创建实例的方法。

  1. let foo = new can.Map([props])
  2. let Foo = can.Map.extend([name,] [staticProperties,] instanceProperties); let foobar = new Foo();
  3. 我试着为这个类写一个简单的类型定义

    declare module "can/map/" {
      class canMap {
      }
    }
    

    但现在我卡住了。

    怎么看那种类型的定义。 我总是得到这样的错误:

      

    不能使用' new'表达式类型缺少调用或   构建签名

1 个答案:

答案 0 :(得分:2)

您可以使用适当的documentation来编写声明文件。

在你的情况下,我认为,它将是这样的:

declare module can {
  class Map {
    constructor(props: any);
    static extend(name, staticProperties, instanceProperties): Map;
    attr(): {[index: string]: any};

    // Declarations for other properties and functions
  }
}

用法(当然,应该加载“canjs”):

var a = new can.Map({});
var b = can.Map.extend({}, {}, {});
var c = a.attr();

更新1

最好的方法是在definitelytyped.org找到明确的类型声明。几乎所有流行的图书馆定义都已经写好了。

您可以使用typings进行“d.ts”文件管理。

更新2

可选参数(标记为“?”)和静态函数“extend”返回构造函数(带有重载):

declare module can {
  class Map {
    constructor(props?: any);
    static extend(instanceProperties): { new(): Map };
    static extend(name, staticProperties, instanceProperties): { new(): Map };
    attr(): {[index: string]: any};

    // Declarations for other properties and functions
  }
}

let creator1 = can.Map.extend({});
let creator2 = can.Map.extend({}, {}, {});
var c = new creator1();

当然,您应该指定函数参数的类型(现在它们是“任何”类型)。 您可以在Typescript documentation中找到更多详细信息。