与类实现分开声明类定义

问题描述 投票:2回答:1

好的,我有一个多代码库项目

我在codebase P1中有一个类:

class ClassInP1 {


}

但我需要在另一个代码库P2中引用该类的类型,但我不想安装P1作为P2的依赖项。要明确:P1导入P2,但我不希望P2导入P1!

最好的方法是在P2中创建一个接口并让ClassInP1实现该接口吗?像这样:

import {InterfaceFromP2} from 'P2';

class ClassInP1 implements InterfaceFromP2 {



}

唯一令人烦恼的是,它不是100%DRY ......这个类几乎都是自我记录的,但后来我在界面中重复了很多,但我想这并不是什么大不了的事。

typescript typescript2.0 typescript2.6
1个回答
1
投票

注意:我在这里使用命名空间来创建一个独立的演示 - 命名空间演示了这个概念,但不需要任何这些工作。

TypeScript本质上是精美的结构,这意味着只有在命名上下文中识别某些内容时,名称才有意义。在使用类型时,它们只需要兼容(具有所需的结构)。

namespace A {
    export class ExampleOne {
        name: string;
        size: number;
    }
}

namespace B {
    export class ExampleOne {
        name: string;
        size: number;
    }

    export class ExampleTwo {
        name: string;
        size: number;
        volume: number;
    }
}

function logExample(example: A.ExampleOne) {
    console.log(example.name);
}

logExample(new A.ExampleOne());

logExample(new B.ExampleOne());

logExample(new B.ExampleTwo());

我可以在任何命名上下文(命名空间,模块)中重用名称ExampleOne

我可以将任何与A.ExampleOne兼容的值传递到logExample函数中。它不必是确切的类,子类,甚至是类 - 只要在结构上是兼容的。

所以你可以拥有

class ClassInP1

}

没有继承原始的ClassInP1,也没有创建界面。

© www.soinside.com 2019 - 2024. All rights reserved.