Javascript 向typescript声明动态原型方法

Javascript 向typescript声明动态原型方法,javascript,typescript,Javascript,Typescript,我正在将一个包含几个“生成的”原型方法的javascript类转换为typescript。生成的方法映射到一个内部对象,因此API对于80%的用例来说更干净/更方便 然而,我发现在没有实际实现的情况下,无法正确地告诉typescript存在哪些方法 class A {} A.prototype.test = function() {} var a = new A().test(); It错误,错误TS2339:类型“A”上不存在属性“test” 似乎我可以通过手动定义属性来绕过它,但这妨碍

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

然而,我发现在没有实际实现的情况下,无法正确地告诉typescript存在哪些方法

class A {}

A.prototype.test = function() {}

var a = new A().test();
It错误,错误TS2339:类型“A”上不存在属性“test”

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

class A {
    test: any;
}

A.prototype.test = function() {}

var a = new A();
a.test();
然而,我发现在没有实际实现的情况下,无法正确地告诉typescript存在哪些方法

class A {}

A.prototype.test = function() {}

var a = new A().test();
如果生成了方法,为什么还要定义类?i、 e.您实际上应该只声明类别,而不是
A类
,即您应该执行以下操作:

declare class A {
  test();
}
我可以通过手动定义属性来绕过它

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

class A {
    test: () => void;
}
A.prototype.test = function() {}
或者,我有时使用的另一种方式:

  • 在TypeScript模块文件中动态构建API,导出一些成员
  • 编译为JavaScript代码
  • 编写一个文件
    index.d.ts
    ,声明API的导出模块成员(如@basarat的答案)
  • 在一个单独的项目中(使用另一个
    tsconfig.json
    ),借助
    index.d.ts
    中的声明,从JavaScript代码导入API的模块成员

  • 这个过程特别适合于发布npm包。

    我还不太熟悉typescript,但您不应该这样做:class a{}a.prototype.test=function(){console.log('test');}var a=new a();a、 test();最好用括号将新的A()括起来,但就本演示而言,它没有任何影响。对。但是当您将
    A
    实例化为一个新类时,
    .test()
    还不能访问。在这里,您必须执行
    var a=newa()然后您可以访问
    a.test()
    …然而,我可能误解了这个问题。我看不到在TypeScript中实现这一点的可能性,编译器不允许您这样做。因为在生成JS代码时,TypeScript在内部将一个类的所有方法和属性放在一个与该类同名的函数的原型链上在我的一个项目上。它工作得很好,但我觉得它不太优雅。可能生成
    .d.ts
    文件会更好,但这实际上取决于您正在处理的用例。
    为什么还要定义类?
    可能类不包含动态内容。;)@Blackus实现可以使用全部或部分动态内容生成。在这两种情况下都可以声明类。@是的,但我的意思是,如果类
    A
    上定义了一些方法,而不仅仅是“附加的”,那么
    declare
    是不够的,对吗?@Blackus声明和实现必须在不同的文件中。我只是写了另一个答案来解释。该类包含大量未生成的方法/属性,因此我仍然需要使用
    类A
    。不幸的是,对于我的特定需求,这可能是过分的。生成它们的部分原因是使用映射的新方法自动更新一个-似乎在每个解决方案中,我都必须在某个地方管理一个实际的静态列表。我更愿意为那些不止一行的代码编写一个包装函数,并在api中实现它们——它还解决了我无法将生成的方法js文档化的问题。