在 TypeScript 定义文件中声明一个 super class

Declaring a super class in a TypeScript definition file

我正在尝试在 TypeScript 中创建一个超级 class,它将作为各种其他文件中其他 classes 的模板。因为我想在多个项目中重用 class 我想在定义文件中声明它。

这是我目前拥有的三个文件:

  1. app.ts

    /// <reference path="genericStuff.d.ts" />
    
    module Foo.Sub {
        export class MyClass extends SomeSuperClass {
            constructor(input: string) {
                super();
                console.log(input);
            }
    
            someTemplateMethod = () => { console.log("working..."); }
        }
    }
    
  2. genericStuff.ts

    /// <reference path="genericStuff.d.ts" />
    
    module Foo {
        export class SomeSuperClass {
            constructor() {
                console.log("Super constructor");
            }
    
            someTemplateMethod = () => { /* no op */ }
            anotherTemplateMethod = () => { /* no op */ }
        }
    
        export class SomeOtherClass implements IDoSomething {
            doSomething() { }
        }
    }
    
  3. genericStuff.d.ts

    declare module Foo {
        interface IDoSomething {
            doSomething: () => void;
        }
    
        export class SomeSuperClass {
            someTemplateMethod: () => void;
            anotherTemplateMethod: () => void;
        }
    }
    

这给我一个错误:

error TS2300: Duplicate identifier 'SomeSuperClass'.

这很有道理,但没有帮助。

我不想直接从 app.ts 引用 genericStuff.ts,但我确实想从该文件扩展 class .这可能吗?

您需要删除 genericStuff.ts 文件中对 genericStuff.d.ts 的引用。从 TypeScript 的角度来看,您定义了相同的 class 两次。

有以下文件:

module Foo {

    export interface IDoSomething {
        doSomething: () => void;
    }

    export class SomeSuperClass {
        constructor() {
            console.log("Super constructor");
        }

        someTemplateMethod = () => { /* no op */ }
        anotherTemplateMethod = () => { /* no op */ }
    }

    export class SomeOtherClass implements IDoSomething {
        doSomething() { }
    }
}

-d 编译让 typescript 创建 .d.ts 文件,它看起来像:

declare module Foo {
    interface IDoSomething {
        doSomething: () => void;
    }

    export class SomeSuperClass {
        someTemplateMethod: () => void;
        anotherTemplateMethod: () => void;
    }
    export class SomeOtherClass implements IDoSomething {
        doSomething():void;
    }
}

然后您可以使用 app.ts