Javascript 组织类型脚本定义以避免重复代码

Javascript 组织类型脚本定义以避免重复代码,javascript,typescript,module,typescript-typings,requirejs-optimizer,Javascript,Typescript,Module,Typescript Typings,Requirejs Optimizer,当前情况: 在中定义了一个类: lib/components/widgets/MyWidget.ts: 它被编译成javascript,作为lib-min.js的一部分与其他文件捆绑在一起 因此,因为它位于lib/components/widgets/MyWidget.ts中,所以我创建了一个定义“集合”文件(mydefinition.d.ts),如下所示: 通过这种方式,它可以像这样使用(当然是在将lib-min.js包含到页面中之后): 问题: 我认为很明显,保持这种重复是压倒性的,很容易导

当前情况:

在中定义了一个类:

lib/components/widgets/MyWidget.ts:

它被编译成javascript,作为lib-min.js的一部分与其他文件捆绑在一起

因此,因为它位于lib/components/widgets/MyWidget.ts中,所以我创建了一个定义“集合”文件(mydefinition.d.ts),如下所示:

通过这种方式,它可以像这样使用(当然是在将lib-min.js包含到页面中之后):

问题:

我认为很明显,保持这种重复是压倒性的,很容易导致错误。 同样在升级到TypeScript2+(从1.8.9)之后,我得到了几个“重复标识符”的编译错误,并且通常它不像以前那样工作

  • 我可以创建一个像IMyWidget这样的接口,并将其公开,但这样的实现就会丢失,无法使用新的
  • 我可以从mydefinition.d.ts中删除“declare module…”,但是模块加载器将找不到该模块(因为r.js优化器根据其路径命名该模块)
问题:

有没有一种干净且“便宜”的方法来解决这个问题(如果可能的话,避免代码重复)

export class MyWidget {

    public property1: string;
    /* ... more properties ... */

}
declare module "lib/components/widgets" {
    export class MyWidget {

        /* documentation of property1 */
        public property1: string;

        /* ... more properties ... */
    }
}

interface MyOption {/* ... */}
import { MyWidget } from "lib/components/widgets/MyWidget";

let myInstance = new MyWidget();