Grigory
Grigory

Reputation: 469

extend express request object with sequelize model using typescript 2

I have some models, such as:

import * as Sequelize from 'sequelize'; // !

export interface UserAttributes {
    id?: number;
    email?: string;
    googleToken?: string;
}
export interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes {
}
export interface UserModel extends Sequelize.Model<UserInstance, UserAttributes> {
}

// ... model definition

I need use import statement to use generic type Sequelize.Instance<TInstance, TAttributes>

I wright some middleware to add user instance to request object (or req.session object, doesn't metter)

Then I need typescript to know my new extending, for this I have file src/_extra.ts with content:

/// <reference path="./models/db.ts" /> -- also does not work
declare namespace Express {
  export interface Request {
    oauthClient: Googleapis.auth.OAuth2; // Googleapis is namespace
    user?: UserInstance; // or ContactsProject.Models.UserInstance;
  }
  export interface Session {/* ... some same */}
}

I need to import my UserInstance type from my model file. Imports break all my _extra namespace definitions, inside namespace I can't use imports. I have tried create namespace ContactsProject, but I getting same problem: if I use imports, typescript don't see my namespace, if I don't, I cant define my UserInstance type. Sequelize doesn't declare namespaces.

I just want import some generic type in my namespace.

I use typescript Version 2.0.3.

Upvotes: 0

Views: 1214

Answers (1)

felixfbecker
felixfbecker

Reputation: 2363

When you use an import statement in a file, TypeScript treats it as a module. Therefor any namespace you declare inside it will not be global anymore, but local to that module.

Import your interface, and then wrap the namespace declaration in a declare global { ... }.

Upvotes: 1

Related Questions