导入typescript类型导致的循环依赖

时间:2018-01-24 08:53:20

标签: angular typescript

我正在使用从服务器发送到我的Angular应用程序的打字稿中的数据建模。 Opportunity具有forms属性,其中包含Form[]个对象的数组。 Form具有parent属性,其中可能包含Opportunity。为了解析类型,定义Opportunity导入Form的文件和定义Form导入Opportunity的文件。这会创建循环依赖性警告。

我发现了几个先前的SO问题,处理循环依赖(herehere),但在每种情况下,它们都在处理javascript代码中的循环依赖。在这种情况下,循环依赖只与typescript类型有关,并且在编译后不存在。有没有办法在避免这种循环依赖问题的同时在文件中包含类型?到目前为止,我还没有找到任何东西。

我可以想到两个解决这个问题的方法:

  1. 在同一档案中定义两个模型
  2. 重新创建Form文件中的Opportunity接口/ Opportunity文件中的Form界面。
  3. 还有其他/更好的解决方案吗?谢谢!

    更新2

    我似乎找到了an answer(出于某种原因,它在问题列表中的位置非常低)。这个答案提出了两种可能性

    1. 创建一个单独的定义文件(似乎涉及重新创建OpportunityForm类接口,因此不会比上面的选项#2更好。

      < / LI>
    2. 使用import,这是我现在正在做的(并且导致循环依赖性警告)。

    3. 有没有办法导入只是类的相关接口?

      更新3

      为了清楚起见,目前OpportunityForm看起来像这样:

      // opportunity.ts
      import { Form } from '....../form'
      
      export class Opportunity {
        public forms: Form[] = [];
      }
      
      // form.ts
      import { Opportunity } from '....../opportunity'
      
      export class Form {
        public parent: Opportunity;
      }
      

4 个答案:

答案 0 :(得分:3)

您可以在form.ts文件中声明类声明类Opportunity {},TypeScript将假定该类是外部类,并且将在运行时可用。你可以在其中一个课程中跳过导入。

这里唯一的痛苦是,你必须声明你将要使用的方法,例如,

declare class Opportunity {
     method1(): void;
     method2(): number;
}

此类将作为简单声明,不需要方法体。 VS intellisense将正常工作。

答案 1 :(得分:1)

您可以通过依赖抽象来删除循环依赖关系,例如,您的form模块可以定义parent必须确认的接口或抽象类。

这意味着您的opportunity模块将取决于form模块,但反之亦然。您可以在Opportunity属性中注入具体的Form.parent,这是可以接受的。

这也允许您定义一个FormParent(见下文),它是Opportunity的一个子集,因为您可能不依赖于{{>> 中的所有 1}}。

由于TypeScript是结构性的,因此您是否在Opportunity类上显式实现接口取决于您。

// opportunity.ts

Opportunity

// form.ts

import { Form } from '....../form'

export class Opportunity {
  public forms: Form[] = [];
}

答案 2 :(得分:1)

另一种方法是在一个类中使用require而不是import
看起来像:

let LoginPage = require("./loginpage").default;
return new LoginPage();

您可以在此post最佳实践#5 中找到它。

答案 3 :(得分:0)

来自打字稿3.8版

import type将为您提供帮助。

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html