Skip to content

Commit

Permalink
feat: fix types for legacy decorator syntax (#9250)
Browse files Browse the repository at this point in the history
  • Loading branch information
runspired authored Mar 10, 2024
1 parent 161cbd2 commit 489497c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 10 deletions.
10 changes: 5 additions & 5 deletions packages/model/src/-private/belongs-to.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,12 +275,12 @@ export function belongsTo(): never;
export function belongsTo(type: string): never;
export function belongsTo<T>(
type: TypeFromInstance<NoNull<T>>,
options: RelationshipOptions<T, false>
options: RelationshipOptions<T, boolean>
): RelationshipDecorator<T>;
export function belongsTo<K extends Promise<unknown>, T extends Awaited<K> = Awaited<K>>(
type: TypeFromInstance<NoNull<T>>,
options: RelationshipOptions<T, true>
): RelationshipDecorator<K>;
// export function belongsTo<K extends Promise<unknown>, T extends Awaited<K> = Awaited<K>>(
// type: TypeFromInstance<NoNull<T>>,
// options: RelationshipOptions<T, true>
// ): RelationshipDecorator<K>;
export function belongsTo(type: string, options: RelationshipOptions<unknown, boolean>): RelationshipDecorator<unknown>;
export function belongsTo<T>(
type?: TypeFromInstance<NoNull<T>>,
Expand Down
10 changes: 5 additions & 5 deletions packages/model/src/-private/has-many.ts
Original file line number Diff line number Diff line change
Expand Up @@ -258,12 +258,12 @@ export function hasMany(): never;
export function hasMany(type: string): never;
export function hasMany<T>(
type: TypeFromInstance<NoNull<T>>,
options: RelationshipOptions<T, false>
options: RelationshipOptions<T, boolean>
): RelationshipDecorator<T>;
export function hasMany<K extends Promise<unknown>, T extends Awaited<K> = Awaited<K>>(
type: TypeFromInstance<NoNull<T>>,
options: RelationshipOptions<T, true>
): RelationshipDecorator<K>;
// export function hasMany<K extends Promise<unknown>, T extends Awaited<K> = Awaited<K>>(
// type: TypeFromInstance<NoNull<T>>,
// options: RelationshipOptions<T, true>
// ): RelationshipDecorator<K>;
export function hasMany(type: string, options: RelationshipOptions<unknown, boolean>): RelationshipDecorator<unknown>;
export function hasMany<T>(
type?: TypeFromInstance<NoNull<T>>,
Expand Down
27 changes: 27 additions & 0 deletions packages/model/src/-private/model.type-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,33 @@ expectTypeOf(branded.bestFriend).toEqualTypeOf<BrandedUser>();
expectTypeOf<Awaited<typeof branded.friends>>().toEqualTypeOf<ManyArray<BrandedUser>>();
expectTypeOf<Awaited<typeof branded.twin>>().toEqualTypeOf<BrandedUser | null>();

class BrandedTypedUser extends Model {
@attr('string') declare name: string | null;
@hasMany<BrandedTypedUser>('user', { async: false, inverse: null }) declare enemies: ManyArray<BrandedTypedUser>;
@belongsTo<BrandedTypedUser>('user', { async: false, inverse: null }) declare bestFriend: BrandedTypedUser;
@hasMany<BrandedTypedUser>('user', { async: true, inverse: 'friends' })
declare friends: PromiseManyArray<BrandedTypedUser>;
@belongsTo<BrandedTypedUser>('user', { async: true, inverse: 'twin' })
declare twin: PromiseBelongsTo<BrandedTypedUser>;
@hasMany<BrandedTypedUser>('user', { async: false, inverse: 'leader' })
declare crew: PromiseManyArray<BrandedTypedUser>;
@belongsTo<BrandedTypedUser>('user', { async: false, inverse: 'crew' })
declare leader: PromiseBelongsTo<BrandedTypedUser>;

[ResourceType] = 'user' as const;
}
const brandedAndTyped = new BrandedTypedUser();

expectTypeOf<Awaited<PromiseManyArray<BrandedTypedUser>>['modelName']>().toEqualTypeOf<'user'>();
expectTypeOf<ManyArray<BrandedTypedUser>['modelName']>().toEqualTypeOf<'user'>();
expectTypeOf<ManyArray<BrandedTypedUser>>().toMatchTypeOf<BrandedTypedUser[]>();

expectTypeOf(brandedAndTyped.name).toEqualTypeOf<string | null>();
expectTypeOf(brandedAndTyped.enemies).toEqualTypeOf<ManyArray<BrandedTypedUser>>();
expectTypeOf(brandedAndTyped.bestFriend).toEqualTypeOf<BrandedTypedUser>();
expectTypeOf<Awaited<typeof brandedAndTyped.friends>>().toEqualTypeOf<ManyArray<BrandedTypedUser>>();
expectTypeOf<Awaited<typeof brandedAndTyped.twin>>().toEqualTypeOf<BrandedTypedUser | null>();

// ------------------------------
// References
// ------------------------------
Expand Down

0 comments on commit 489497c

Please sign in to comment.