将动态原型方法声明为打字稿

时间:2016-07-08 04:56:04

标签: javascript typescript

我正在将一个带有几个“生成”原型方法的javascript类转换为typescript。生成的方法被映射到内部对象,因此API对于80%的用例来说更清晰/更方便。

但是,我发现没有办法正确地告诉打字稿哪些方法存在而没有实际实现它们。

class A {}

A.prototype.test = function() {}

var a = new A().test();

error TS2339: Property 'test' does not exist on type 'A'

错误

似乎我可以通过手动定义属性来绕过它,但这阻碍了自动映射这些方法的有用性。

class A {
    test: any;
}

A.prototype.test = function() {}

var a = new A();
a.test();

2 个答案:

答案 0 :(得分:1)

  

但是,我发现没有办法正确地告诉打字稿哪些方法存在而没有实际实现它们。

如果生成方法,为什么要定义类?即,而不是class A你真的应该只是宣布这个类,即你应该做的事情:

declare class A {
  test();
}

答案 1 :(得分:0)

  

我可以通过手动定义属性来解决这个问题

是。由于动态部分,TypeScript无法静态推断类型。必须手动定义:

class A {
    test: () => void;
}
A.prototype.test = function() {}

或者,我有时使用的另一种方式:

  1. 在TypeScript模块文件中动态构建API,导出一些成员;
  2. 编译为JavaScript代码;
  3. 写一个文件index.d.ts声明 API的导出模块成员(如@basarat的答案);
  4. 在一个单独的项目中(使用另一个tsconfig.json),在index.d.ts的声明的帮助下,从JavaScript代码中导入API的模块成员。
  5. 此过程特别适合发布 npm 包。