From 1db431ca1fe26ae33ac95a79a312b1d4732e0606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moacir=20P=2E=20de=20Sa=CC=81=20Pereira?= Date: Tue, 22 Feb 2022 15:51:34 -0500 Subject: [PATCH 1/2] docs: Encourage the use of type-only imports --- docs/ember-data/models.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/ember-data/models.md b/docs/ember-data/models.md index 23d2e598a..8465bf399 100644 --- a/docs/ember-data/models.md +++ b/docs/ember-data/models.md @@ -58,7 +58,13 @@ export default class User extends Model { } ``` -## `@belongsTo` +## Relationships + +Relationships between models in Ember Data rely on importing the related models, like `import User from './user';`. This, naturally, can cause a recursive loop, as `/app/models/post.ts` imports `User` from `/app/models/user.ts`, and `/app/models/user.ts` imports `Post` from `/app/models/post.ts`. Recursive importing triggers an [`import/no-cycle`](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-cycle.md) error from eslint. + +One should be certain to make use of [type-only imports](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html), available since TypeScript 3.8, and write `import type User from './user';`. + +### `@belongsTo` The type returned by the `@hasMany` decorator depends on whether the relationship is `{ async: true }` \(which it is by default\). @@ -70,8 +76,8 @@ So, for example, you might define a class like this: ```typescript import Model, { belongsTo } from '@ember-data/model'; import DS from 'ember-data'; // NOTE: this is a workaround, see discussion below! -import User from './user'; -import Site from './site'; +import type User from './user'; +import type Site from './site'; export default class Post extends Model { @belongsTo('user') @@ -89,7 +95,7 @@ These are _type_-safe to define as always present, that is to leave off the `?` Note, however, that this type-safety is not a guarantee of there being no runtime error: you still need to uphold the contract for non-async relationships \(that is: loading the data first, or side-loading it with the request\) to avoid throwing an error! -## `@hasMany` +### `@hasMany` The type returned by the `@hasMany` decorator depends on whether the relationship is `{ async: true }` \(which it is by default\). @@ -102,8 +108,8 @@ So, for example, you might define a class like this: import Model, { hasMany } from '@ember-data/model'; import EmberArray from '@ember/array'; import DS from 'ember-data'; // NOTE: this is a workaround, see discussion below! -import Comment from './comment'; -import User from './user'; +import type Comment from './comment'; +import type User from './user'; export default class Thread extends Model { @hasMany('comment') From 1f7514f34385441d68c1d6e353507b05dda381ba Mon Sep 17 00:00:00 2001 From: Chris Krycho Date: Tue, 22 Feb 2022 14:50:58 -0700 Subject: [PATCH 2/2] Add a code sample to new `import type` recommendation --- docs/ember-data/models.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/ember-data/models.md b/docs/ember-data/models.md index 8465bf399..d8f9bacd3 100644 --- a/docs/ember-data/models.md +++ b/docs/ember-data/models.md @@ -62,7 +62,11 @@ export default class User extends Model { Relationships between models in Ember Data rely on importing the related models, like `import User from './user';`. This, naturally, can cause a recursive loop, as `/app/models/post.ts` imports `User` from `/app/models/user.ts`, and `/app/models/user.ts` imports `Post` from `/app/models/post.ts`. Recursive importing triggers an [`import/no-cycle`](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-cycle.md) error from eslint. -One should be certain to make use of [type-only imports](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html), available since TypeScript 3.8, and write `import type User from './user';`. +To avoid these errors, use of [type-only imports](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html), available since TypeScript 3.8: + +```ts +import type User from './user'; +``` ### `@belongsTo`