2017-12-13 10 views
0

私はRestifyを使って作業しています(Restifyが分からない場合はExpress.jsとみなします)。オブジェクトを要求オブジェクトにアタッチしたいので、次のルート。クラスオブジェクトの型定義を拡張する

より具体的な例:req.user = data; typescriptですが、明らかに私に叫んされ、このラインで

export const validate: ValidateFn = async (req: Request, res: Response, next: Next): Promise<void> => {  
    // Validate and parse token from headers 
    const authHeader: string = req.header('authorization', null); 
    const parsedToken: string = parseBearerToken(authHeader); 
    if (parsedToken == null) { return next(new errors.InvalidCredentialsError('Missing authorization')); } 

    // Verify token 
    try { 
    const data: {} = jwt.verify(parsedToken, config.apiServer.jwtSecret); 
    req.user = data; 
    } catch (err) { 
    return next(new errors.NotAuthorizedError('Invalid authentication')); 
    } 

    return next(); 
}; 

、与えられたリクエストオブジェクトにuserと呼ばれるフィールドがないので。私は理想的には、名前を変更しても同じ名前で利用できるように、user: {};の名前を付けて、Requestの定義を単純に拡張できると考えました。

また、新しいタイプ(RequestValidatedなど)を作成しても問題はありませんが、ライブラリの名前空間全体(追加のインポートなし)で使用できるようにしたいと思います。私はそれがために利用可能であるように、(Requestオブジェクトに添付カスタムプロパティのように)私のカスタム変更を加えるために、サードパーティのライブラリの定義を拡張することができますどのように

を:だから、私の質問は一つの文章にまとめ

オリジナルの入力ファイルを編集することなく同じ名前空間を使用することができます(これは完全に型指定されたレポの一部です)。

答えて

1

モジュールとモジュールでインターフェイスを再宣言し、必要なフィールドを追加することができます。宣言は単一のインタフェースにマージされます。これを別のファイルに入れてプロジェクトに含めると、そのファイルが選択されます。

// restify.extra.d.ts 
import { Request } from 'restify' 
declare module 'restify' { 
    interface Request { 
     user: any 
    } 
} 
// Other file: 
import { Request } from 'restify' 

let r: Request; 
r.accepts(""); 
r.user = ";"; 
+1

わかりましたが、私はRequestインターフェイスを拡張する必要がありましたが、それは必要ではなく、定義されたプロパティが追加されました。完璧!どうもありがとう。 – kentor

関連する問題