Как решить круговые зависимости при использовании классов в качестве типов в Typescript? - PullRequest
1 голос
/ 16 апреля 2020

Как я могу использовать ввод в машинописи, который не приводит к ошибкам циклической зависимости?

Кажется, что возникает ошибка циклической зависимости, даже если импорт должен быть удален, когда код компилируется в допустимый JS. Это ошибка?

user-model.ts

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

export class User {
  Posts: Post[];
}

post-model.ts

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

export class Post {
  User: User;
}

Я слышал о двух возможных решениях, которые оба не принимают меня не устраивает.

Во-первых, создать новый интерфейс, соответствующий классу: Круговая зависимость, вызванная импортом типа машинописи

И я кое-что прочитал в Документы typegraphql: https://typegraphql.com/docs/types-and-fields.html

Там они говорят:

Зачем использовать синтаксис функции, а не простой объект конфигурации {type: Rate}? Потому что, используя синтаксис функции, мы решаем проблему циклических зависимостей (например, Post <-> User), поэтому она была принята как соглашение. Вы можете использовать сокращенный синтаксис @Field (() => Rate), если хотите сохранить некоторые нажатия клавиш, но они могут быть менее читабельными для других.

Я также не нашел никакой возможности отключить предупреждение о циклической зависимости в машинописи.

Я работаю в Nrwl / Angular 9.x

Спасибо за любую помощь заранее!

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Использование интерфейсов - лучший вариант здесь. Вы можете сделать .d.ts для каждого, а затем импортировать его.

user.d.ts

export interface IUser {
  Posts: IPost[];
}

post.d.ts

export interface IPost {
  User: IUser;
}

А потом ...

import { IPost, IUser } from './post.d'

export class User implements IUser {
  Posts: IPost[];
}
1 голос
/ 16 апреля 2020

Вы можете сделать это, только если вы поместите их в один и тот же файл

export class User {
  Posts: Post[];
}

export class Post {
  User: User;
}

или если вы напишите их типа

user-post.types.ts

export interface User {
  Posts: Post[];
}

export interface Post {
  User: User;
}

user-model.ts

import { Post } from '../user-post.types'

export class User {
  Posts: Post[];
}

post-model.ts

import { User } from '../user-post.types'

export class Post {
  User: User;
}
...