From 65819e5c3871738b56867b4d5bcf2371849e1980 Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Sun, 10 Mar 2024 16:17:54 -0700 Subject: [PATCH] feat: fix types for legacy decorator syntax --- packages/model/src/-private/belongs-to.ts | 10 +++---- packages/model/src/-private/has-many.ts | 10 +++---- .../model/src/-private/model.type-test.ts | 27 +++++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/packages/model/src/-private/belongs-to.ts b/packages/model/src/-private/belongs-to.ts index 048ba69950d..2eb5c0a4d80 100644 --- a/packages/model/src/-private/belongs-to.ts +++ b/packages/model/src/-private/belongs-to.ts @@ -275,12 +275,12 @@ export function belongsTo(): never; export function belongsTo(type: string): never; export function belongsTo( type: TypeFromInstance>, - options: RelationshipOptions + options: RelationshipOptions ): RelationshipDecorator; -export function belongsTo, T extends Awaited = Awaited>( - type: TypeFromInstance>, - options: RelationshipOptions -): RelationshipDecorator; +// export function belongsTo, T extends Awaited = Awaited>( +// type: TypeFromInstance>, +// options: RelationshipOptions +// ): RelationshipDecorator; export function belongsTo(type: string, options: RelationshipOptions): RelationshipDecorator; export function belongsTo( type?: TypeFromInstance>, diff --git a/packages/model/src/-private/has-many.ts b/packages/model/src/-private/has-many.ts index f3171810708..d85e6aba4d3 100644 --- a/packages/model/src/-private/has-many.ts +++ b/packages/model/src/-private/has-many.ts @@ -258,12 +258,12 @@ export function hasMany(): never; export function hasMany(type: string): never; export function hasMany( type: TypeFromInstance>, - options: RelationshipOptions + options: RelationshipOptions ): RelationshipDecorator; -export function hasMany, T extends Awaited = Awaited>( - type: TypeFromInstance>, - options: RelationshipOptions -): RelationshipDecorator; +// export function hasMany, T extends Awaited = Awaited>( +// type: TypeFromInstance>, +// options: RelationshipOptions +// ): RelationshipDecorator; export function hasMany(type: string, options: RelationshipOptions): RelationshipDecorator; export function hasMany( type?: TypeFromInstance>, diff --git a/packages/model/src/-private/model.type-test.ts b/packages/model/src/-private/model.type-test.ts index 20cf1f51d05..642103560ff 100644 --- a/packages/model/src/-private/model.type-test.ts +++ b/packages/model/src/-private/model.type-test.ts @@ -60,6 +60,33 @@ expectTypeOf(branded.bestFriend).toEqualTypeOf(); expectTypeOf>().toEqualTypeOf>(); expectTypeOf>().toEqualTypeOf(); +class BrandedTypedUser extends Model { + @attr('string') declare name: string | null; + @hasMany('user', { async: false, inverse: null }) declare enemies: ManyArray; + @belongsTo('user', { async: false, inverse: null }) declare bestFriend: BrandedTypedUser; + @hasMany('user', { async: true, inverse: 'friends' }) + declare friends: PromiseManyArray; + @belongsTo('user', { async: true, inverse: 'twin' }) + declare twin: PromiseBelongsTo; + @hasMany('user', { async: false, inverse: 'leader' }) + declare crew: PromiseManyArray; + @belongsTo('user', { async: false, inverse: 'crew' }) + declare leader: PromiseBelongsTo; + + [ResourceType] = 'user' as const; +} +const brandedAndTyped = new BrandedTypedUser(); + +expectTypeOf>['modelName']>().toEqualTypeOf<'user'>(); +expectTypeOf['modelName']>().toEqualTypeOf<'user'>(); +expectTypeOf>().toMatchTypeOf(); + +expectTypeOf(brandedAndTyped.name).toEqualTypeOf(); +expectTypeOf(brandedAndTyped.enemies).toEqualTypeOf>(); +expectTypeOf(brandedAndTyped.bestFriend).toEqualTypeOf(); +expectTypeOf>().toEqualTypeOf>(); +expectTypeOf>().toEqualTypeOf(); + // ------------------------------ // References // ------------------------------