V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nahcikuy
V2EX  ›  TypeScript

TypeScript 中,对 Class 进行代码分割有什么比较优雅的 practice 吗?

  •  
  •   nahcikuy · 2021-12-10 20:22:43 +08:00 via Android · 1540 次点击
    这是一个创建于 839 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面是我能想到的一些做法。

    • 实现分离

    Class 中只保留方法定义和实现的接口调用,具体的实现放入其他文件当中。

    劣势:TS 不支持像 C++那种声明和定义分离的写法,所以具体的实现方法只能定义在类的外部,并且需要把实例作为参数传入,或者绑定到 this; TS 不支持 friend class 特性,这导致这些定义在外部的方法无法访问到类里面的 private 和 protected 成员。

    • 继承链

    直接暴力的拆分类的方式,把拆分后的不同部分分别定义为类并用 extends 连接。

    优势:封闭性,这使得 private 和 protected 定义能够最大程度发挥它们的价值。

    劣势:这种 practice 与 inheritation 的语义不符。类之间需要解决依赖关系问题,并且不能存在依赖闭环(依赖图必须是 DAG )。TS 不支持多重继承,因此需要把依赖关系明确的 DAG 依赖图退化到基于其拓扑序的单一继承链。

    • 混入( Mixin )

    参考这个链接

    优势:可以模拟多重继承; 模块之间解耦度高,便于扩展。

    劣势:要求模块之间必须有比较高的独立性,如果各模块之间需要调用其他模块的方法的话,则实现起来会显得棘手。

    3 条回复    2021-12-10 23:22:33 +08:00
    hanai
        1
    hanai  
       2021-12-10 21:44:04 +08:00
    abstract class?
    SilencerL
        2
    SilencerL  
       2021-12-10 22:40:19 +08:00   ❤️ 1
    abstract class Foo {
    protected age: number = 18;

    abstract test(): void;
    }

    class Foo2 extends Foo {
    public test() {
    console.info("supers age:", this.age);
    }
    }

    const foo2 = new Foo2();

    foo2.test()

    ------------------
    output:
    supers age: 18


    ------------------
    父类的 protected 成员是可以访问的,private 成员无法访问是符合逻辑的,.NET 也是这样的,Java 倒是好多年没写记不清楚了
    LancerComet
        3
    LancerComet  
       2021-12-10 23:22:33 +08:00
    TS 做不到 partial class ,所以怎么搞都不舒服
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5293 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:13 · PVG 17:13 · LAX 02:13 · JFK 05:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.