2016-08-19 28 views
5

私は、セッション記憶域で自分のカスタムデータを使用できるようにExpressセッションの型を拡張したいと考えています。私は私のクラスUserのインスタンスであるオブジェクトreq.session.userを持っている:定義ファイルのインポートクラス(* d.ts)

export class User { 
    public login: string; 
    public hashedPassword: string; 

    constructor(login?: string, password?: string) { 
     this.login = login || "" ; 
     this.hashedPassword = password ? UserHelper.hashPassword(password) : ""; 
    } 
} 

は、だから私は、既存の特急セッションタイピングと定義をマージする私のown.d.tsファイルを作成:

import { User } from "./models/user"; 

declare module Express { 
    export interface Session { 
     user: User; 
    } 
} 

しかし、それは全く働いていません - VSコードとtscはそれを見ません。

declare module Express { 
    export interface Session { 
     test: string; 
    } 
} 

とテストフィールドは[OK]を働いているので、輸入原因となる問題:だから私は、テスト単純型で定義を作成しました。

代わりに/// <reference path='models/user.ts'/>をインポートしようとしましたが、tscにUserクラスが表示されませんでした。* d.tsファイルで自分のクラスを使用するにはどうすればいいですか?

EDIT: 私はコンパイルに定義ファイルを生成するためにTSC設定し、今私は私のuser.d.tsを持っている:

export declare class User { 
    login: string; 
    hashedPassword: string; 
    constructor(); 
    constructor(login: string, password: string); 
} 

とエクスプレスSesionを拡張するための独自のタイピングファイル:

import { User } from "./models/user"; 
declare module Express { 
    export interface Session { 
     user: User; 
     uuid: string; 
    } 
} 

import文を一番上に置いても、まだ動作しません。何か案は?

答えて

1

私はあなたが直面している問題は、増強モジュール宣言、クラスタイピングについての詳細だと思います。

輸出は、あなたがこれをコンパイルしようとした場合、あなたが気づくよう、細かいです:あなたはExpressのモジュール宣言を強化しようとしている、とあなたが本当に接近しているように思え

// app.ts 
import { User } from '../models/user' 
let theUser = new User('theLogin', 'thePassword') 

。これは、トリックを行う必要があります。

// index.d.ts 
import { User } from "./models/user"; 
declare module 'express' { 
    interface Session { 
    user: User; 
    uuid: string; 
    } 
} 

しかし、このコードの正しさは明示宣言ファイルの元の実装に依存もちろん。

+0

importステートメントを内部で移動すると、エラーが発生します。 '名前空間の宣言をインポートするとモジュールを参照できません.' あなたのコードをコピーして貼り付けると、 'アンビエントモジュール宣言のインポートまたはエクスポート宣言は相対モジュール名でモジュールを参照できません。 ' 非相対パスを使用しようとすると自分のファイルを見つけることができないので、declarationsフォルダをnode_modulesに移動して '' declarations/models/user''のパスを追加しましたが、まだd.tsが動作しません - can intelisenseまたはtscでの明示セッションの独自の拡張を参照してください。 –

+0

私はこれらのエラーに精通していません、ごめんなさい。多分あなたのセットアップには何か違うことがありますか?これはあなたのためにコンパイルするのですか? https://gist.github.com/pellejacobs/498c997ebb8679ea90826177cf8a9bad。 –

+0

これは動作しますが、それでもまだ実際のアプリケーションでは動作しません。私は、セッションオブジェクトを持つ明示的な要求オブジェクトを持っていて、他の型が宣言されています - 明示的に 'express'モジュールではないエクスプレスモジュール: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/express-session/express-session .d.ts –

関連する問題