相关疑难解决方法(0)

TypeScript中的循环类型引用

我是打字稿的新手,我想了解如何在两种类型之间设置循环引用.引用不必是完整的代码引用,只需要接口,但接口定义在单独的文件中.例如,假设我有两个接口:Parent和Child.它们是双重关联的,因此父母有一个孩子的集合,每个孩子都有父母的参考(如下所示).如何设置导入或依赖项,以便可以在单独的文件中定义它们?

interface Parent {
  children: Child[]
}

interface Child {
  parent: Parent
}
Run Code Online (Sandbox Code Playgroud)

typescript

16
推荐指数
3
解决办法
7831
查看次数

在 Typescript 中使用类作为类型时如何解决循环依赖?

我如何使用不会遇到循环依赖错误的打字稿?

尽管当代码编译为有效的 JS 时应该删除导入,但似乎还是发生了循环依赖错误。这是一个错误吗?

用户模型.ts

import { Post } from '../post-model'

export class User {
  Posts: Post[];
}
Run Code Online (Sandbox Code Playgroud)

后模型.ts

import { User } from '../user-model'

export class Post {
  User: User;
}
Run Code Online (Sandbox Code Playgroud)

我听说过两种可能的解决方案,但都不令我满意。

一是,新建一个与类匹配的接口: 导入typescript类型导致的循环依赖

我在 typegraphql 的文档中读到了一些内容: https ://typegraphql.com/docs/types-and-fields.html

他们在那里说:

为什么使用函数语法而不是简单的 { type: Rate } 配置对象?因为,通过使用函数语法我们解决了循环依赖的问题(例如Post <--> User),所以它被采用作为约定。如果您想保存一些击键,则可以使用简写语法 @Field(() => Rate),但对其他人来说可能不太可读。

我也没有找到任何选项来禁用打字稿中的循环依赖警告。

我正在 Nrwl/Angular 9.x 工作

circular-dependency typescript typescript-typings typegraphql

13
推荐指数
2
解决办法
7459
查看次数

在 Typescript 中重构循环依赖

我有一个 API,它对导致循环依赖的数据进行非规范化。有没有办法使用抽象类、接口、组合或其他技术来重构以下内容,我不需要为每个实体创建 N 个部分类以避免我的 Angular 应用程序的类型定义中的循环依赖?

模型.ts

export abstract class Model {
  // ... Model related data members and functions
}
Run Code Online (Sandbox Code Playgroud)

人.ts

import { Model } from './model';
import { Site } from './site';

export class Person extends Model {

  // ... Data

  site: Site; // Partially or Fully saturated site entity
}
Run Code Online (Sandbox Code Playgroud)

网站.ts

import { Model } from './model';
import { Person } from './person';

export class Site extends Model {

  // ... Data

  people: Person[]; // array of …
Run Code Online (Sandbox Code Playgroud)

typescript angular

5
推荐指数
2
解决办法
552
查看次数

TypeScript 装饰器和循环依赖

考虑使用装饰器的相互依赖代码示例(如下)。

现在考虑以下工作流程(是的,我确实想传递实际导出的类,因为我以后需要使用它们):

  1. 应用程序导入和运行 Parent.ts
  2. @Test(Child)导致应用程序Child.ts在装饰时导入
  3. 注意:Parent代码尚未到达该类
  4. Child.ts@Test(Parent)装饰器被执行
  5. 此时,Parent未定义且无法传递给装饰器。

正如你所看到的,有一个讨厌的循环依赖,我看不到一种能够应用将类作为相互引用的参数的装饰器的方法。

请注意,我@Test以简洁为例。实际的装饰器是@HasManyand @BelongsTo- 所以我在这里有一个实际的用例。

我的问题是: “这个问题有解决方案吗?”

我担心没有,除非更改 TypeScript 的编译代码以推迟装饰过程,直到导入所有相关代码。

代码示例:

Decorators.ts

    export function Test(passedClass: Function): Function {
        return function (model: Function): void {
            console.log(typeof passedClass);
        };
    }
Run Code Online (Sandbox Code Playgroud)

Parent.ts

    import {Child} from "./Child";
    import {Test} from "./Decorators";

    @Test(Child)
    export class Parent {

    }
Run Code Online (Sandbox Code Playgroud)

Child.ts

    import {Parent} from "./Parent";
    import {Test} from "./Decorators";

    @Test(Parent)
    export …
Run Code Online (Sandbox Code Playgroud)

javascript circular-dependency decorator undefined typescript

4
推荐指数
1
解决办法
1260
查看次数

如何将循环依赖的打字稿类移动到单独的文件中

在一个有角度的项目中,我们有一个基类,从中可以导出几个具体的类。在少数情况下,这些类以循环方式相互引用。

当这些文件位于不同的类中时,项目将成功编译,但无法在浏览器中运行。

当所有类都放在一个.ts文件中时,一切正常,但我们的文件非常长,很难维护。

有没有办法分离这些文件?即使是现有的以智能方式合并文件的预编译任务也将受到赞赏。

编辑:我熟悉导入,模块等。问题是循环依赖。同样,不能通过更多抽象优雅地处理它。我尝试添加最少的复制代码。

编辑:这是复制品,产生警告:它还显示了我开始具有循环依赖关系的原因。

base-class.ts:

import {StorageModel} from './storage-model';
import {SubClass1} from './sub-class-1';

export abstract class BaseClass {
  children: BaseClass[];

  abstract loadFromModel(model: StorageModel);

  doSomething() {
    if (this.children[0] instanceof SubClass1) {
      (this.children[0] as SubClass1).action1();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

sub-class-1.ts:

import {BaseClass} from './base-class';
import {StorageModel} from './storage-model';
import {SubClass2} from './sub-class-2';

export class SubClass1 extends BaseClass {
  title: string = 'hello';
  action1() {
  }

  loadFromModel(model: StorageModel) {
     (this.children[0] as SubClass2).action2();
  }
}
Run Code Online (Sandbox Code Playgroud)

和类似的sub-class-2.ts。我在cli cli控制台中收到以下警告:

WARNING in Circular dependency …
Run Code Online (Sandbox Code Playgroud)

typescript angular

4
推荐指数
1
解决办法
1620
查看次数