【问题标题】:Allow circular references and imported modules in Typescript在 Typescript 中允许循环引用和导入模块
【发布时间】:2018-04-12 21:53:29
【问题描述】:

我有一个带有循环引用的打字稿项目,即。 A 类引用 B 类,B 类引用 A 类。此外,还有包含 export 语句的外部模块。我无法更改这些。

方法 1

使用导入语句:

import { ClassName } from './path/to/the/file';

这不允许循环引用。重写代码以避免循环引用对我来说不是一个选择。

方法 2

有一个 definitions.d.ts 文件引用项目中的每个文件,如下所示:

/// <reference path="path/to/the/file"/>

然后,在每个代码文件中,定义文件的引用方式都相同。

这个解决方案似乎允许循环引用。但是,不能像这样引用带有export 语句的外部模块文件,所以我需要使用import 语句。问题是,一旦文件使用了import 语句,它似乎也变成了一个模块,并且不能再使用/// &lt;reference 指令来引用。

什么是允许循环引用和外部模块的良好项目结构?

编辑:将两个类放入同一个文件正是我想要的。有没有办法在为每个类保留一个单独的文件的同时实现相同的目标?

【问题讨论】:

    标签: typescript import module


    【解决方案1】:

    你应该避免循环引用,没有很多好的选择和很多问题。一种方法应该是创建一个包含 A 类和 B 类的 C 类,并避免 A 和 B 之间的内部引用,并在 C 类中实现混合功能。

    【讨论】:

    • 循环引用有什么问题?我想避免添加大量样板代码。
    • 在我的例子中,父类引用了它的子类。
    • 循环解决方案不可扩展,不受工具和 IDES 支持,并且存在许多其他已知有助于避免循环引用的组合或结构模式(在 Gamma-Helm-Johnson 和 Vlissides 意义上)。像 Composite 或 Facade 模式。
    • 这对我没有帮助...我只是将两个类复制到同一个文件中,它工作得很好,只是看起来很糟糕。也许最好的解决方案是在运行 tsc 之前连接所有 *.ts 文件。
    【解决方案2】:

    我将尝试通过提取一个界面来解决这个问题,尽管我觉得这很烦人。

    我想只公开所需的方法/字段以保持代码完成建议列表更清晰可能是一个优势:

    export interface C {
        ...
    }
    

    A 类现在实现 C:

    export class A implements C {
        ...
    }
    

    并更改类 B 以引用 C 而不是 A:

    export class B {
        private a : C;
        // instead of private a : A;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      相关资源
      最近更新 更多