sequelize / sequelize-typescript

Decorators and some other features for sequelize
MIT License
2.78k stars 280 forks source link

Using offset along with limit in include options gives compilation error. But query works if I add ts-ignore to it #875

Open zebkailash opened 3 years ago

zebkailash commented 3 years ago

Versions

I'm submitting a ...

[ ] bug report [ ] feature request

Actual behavior:

It gives compilation error with message property does not exist on typeof Model | IncludedOptions etc

Expected behavior:

It should not give compilation error as query which is created works as expected.

Steps to reproduce:

  1. Create 2 Models eg: Team, Player

  2. Association Team hasMany Players.

  3. Fetch Team and its players.

Related code:

// Two models eg:
Team, Player

Team.hasMany(Players);

// Fetch team and its players let's say I want to apply pagination on players array.

// Query will be
Team.findOne({
  where: { id: 1 },
  include: [
  { model: Player, limit: 5, offset: 0 } // using offset here gives compile error 
  ]
})

Workaround Add @ts-ignore-next-line before the offset property.

ezalivadnyi commented 3 years ago

Thanks a lot, guys, for this package! I have a similar error with offset property inside deep include. The following code worked before the project was typescripted. Please give me suggestions of how can I fix it?

package.json:

code:

let teamEvent = await TeamEventModel.findOne({
    where: {url_code},
    include: [{
        Event: EventModel,
        include: [{
            Game: GameModel,
            include: [{
                model: PartModel,
                order: [['order', 'ASC']],
                limit: 1,
                offset: 1,
            }]
        }]
    }]
});

error:

TS2769: No overload matches this call.   
Overload 1 of 2, '(this: ModelStatic<TeamEventModel>, options: NonNullFindOptions<any>): Promise<TeamEventModel>', gave the following error.    
Type '{ model: typeof PartModel; order: [string, string][]; limit: number; offset: number; }' is not assignable to type 'Includeable'.       
Object literal may only specify known properties, and 'offset' does not exist in type 'typeof Model | Association<Model<any, any>, Model<any, any>> | IncludeOptions | { all: true; nested?: true | undefined; }'.   
Overload 2 of 2, '(this: ModelStatic<TeamEventModel>, options?: FindOptions<any> | undefined): Promise<TeamEventModel | null>', gave the following error.     
Type '{ model: typeof PartModel; order: [string, string][]; limit: number; offset: number; }' is not assignable to type 'Includeable'.       
Object literal may only specify known properties, and 'offset' does not exist in type 'typeof Model | Association<Model<any, any>, Model<any, any>> | IncludeOptions | { all: true; nested?: true | undefined; }'.
zebkailash commented 3 years ago

@ezalivadnyi Add @ts-ignore-next-line before the offset it will execute the query properly. Typings are not updated for offset property in include query.

theoludwig commented 3 years ago

Hey, is it still the case with sequelize@6.4.0 and sequelize-typescript@2.0.0 ? @zebkailash

goalia commented 3 years ago

There is not offset in Include option if you go inside the sequelize package. Some of people speak about this issue here. I have submitted an issue in sequelize repository 👌🏼

ephys commented 2 years ago

I can confirm that this is a bug in Sequelize, not Sequelize-Typescript. I've reopened your issue @goalia