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

Joh*_*ohn 6 typescript angular

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

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

对于这个问题,我可以想到两种解决方案:

  1. 在同一个文件中定义两个模型
  2. 重新创建Form的接口Opportunity文件/中Opportunity的接口Form文件。

还有其他/更好的解决方案吗?谢谢!

更新 2

我似乎找到答案(出于某种原因,它在问题列表中的位置真的很靠后)。这个答案提出了两种可能性

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

  2. 使用导入,这是我已经在做的(并且导致循环依赖警告)。

有没有办法导入刚才一类的相关接口?

更新 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;
}
Run Code Online (Sandbox Code Playgroud)

moz*_*ozu 12

从打字稿版本 3.8 开始

import type会帮助你的。

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


Aka*_*ava 4

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

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

declare class Opportunity {
     method1(): void;
     method2(): number;
}
Run Code Online (Sandbox Code Playgroud)

该类将用作简单声明,不需要方法体。并且 VS 智能感知将正常工作。