我正在使用从服务器发送到我的Angular应用程序的打字稿中的数据建模。 Opportunity
具有forms
属性,其中包含Form[]
个对象的数组。 Form
具有parent
属性,其中可能包含Opportunity
。为了解析类型,定义Opportunity
导入Form
的文件和定义Form
导入Opportunity
的文件。这会创建循环依赖性警告。
我发现了几个先前的SO问题,处理循环依赖(here,here),但在每种情况下,它们都在处理javascript代码中的循环依赖。在这种情况下,循环依赖只与typescript类型有关,并且在编译后不存在。有没有办法在避免这种循环依赖问题的同时在文件中包含类型?到目前为止,我还没有找到任何东西。
我可以想到两个解决这个问题的方法:
Form
文件中的Opportunity
接口/ Opportunity
文件中的Form
界面。还有其他/更好的解决方案吗?谢谢!
我似乎找到了an answer(出于某种原因,它在问题列表中的位置非常低)。这个答案提出了两种可能性
创建一个单独的定义文件(似乎涉及重新创建Opportunity
和Form
类接口,因此不会比上面的选项#2更好。
使用import,这是我现在正在做的(并且导致循环依赖性警告)。
有没有办法导入只是类的相关接口?
为了清楚起见,目前Opportunity
和Form
看起来像这样:
// opportunity.ts
import { Form } from '....../form'
export class Opportunity {
public forms: Form[] = [];
}
// form.ts
import { Opportunity } from '....../opportunity'
export class Form {
public parent: Opportunity;
}
答案 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