2016-02-07 64 views
1

我有這樣的代碼在javascript:打字稿:房產「解碼」不存在於類型請求

if (token) { 

    // verifies secret and checks exp 
    jwt.verify(token, Config.Secret, function(err, decoded) {  
     if (err) { 
     return res.json({ success: false, message: 'Failed to authenticate token.' });  
     } else { 
     // if everything is good, save to request for use in other routes 
     req.decoded = decoded;  
     next(); 
     } 
    }); 

    } else { 

    // if there is no token 
    // return an error 
    return res.status(403).send({ 
     success: false, 
     message: 'No token provided.' 
    }); 

    } 

要重寫它的打字稿,但得到一個錯誤Property decoded does not exists on type Request

任何想法如何解決?

+0

你有'Request'的類型定義嗎? –

+0

@VadimMacagon是的,它來自'express''import {Request,Response} from「express」;' – sreginogemoh

+0

我在[express.d.ts]中看不到'encoded'字段(https://github.com/DefinitelyTyped /DefinitelyTyped/blob/master/express/express.d.ts),它是你自己添加的字段嗎? –

回答

1

您將需要使用聲明合併來爲自定義Request字段添加類型定義。這樣做創建.d.ts文件看起來像這樣:

declare module Express { 
    export interface Request { 
    decoded: string; 
    // etc. 
    } 
} 

它使編譯器合併與express.d.ts的那些類型定義添加到您的編譯環境。

+0

這是一個非常模糊的(雖然通常的做法)。我不會推薦它,它絕對不是最好的方法。 – FlorianTopf

+0

我會向所有來這裏尋求真正答案的人推薦這種方法,因爲它是這個頁面上唯一真正有效的方法。 – uglycoyote

0

即使可能,我也不會合並來自具有相同名稱的模塊的接口。我寧願創建一個新的自定義界面,你甚至可以在你使用的同一個文件中聲明它。 (否則,只是將其導出)

import {Request, Response} from "express"; 

interface CustomRequest extends Request { 
    decoded: string; 
} 

這是更爲清潔,而且它更接近OOP。

+0

這種方法只會導致追逐更多的類型錯誤,例如,錯誤'TS2345:類型'(req:CustomRequest,res:Response)=> void'的參數不能分配給'RequestHandlerParams'類型的參數。 類型'(req:CustomRequest,res:Response)=> void'不能分配給類型'(RequestHandler | ErrorRequestHandler)[]'。 類型'(請求:CustomRequest,res:Response)=> void'中缺少屬性'push'。 – uglycoyote

+0

你能提供一個你有這個問題的片段嗎?我從來沒有遇到過擴展express的標準接口的問題。我想了解1.你的問題和2. downvote。你似乎用錯誤的類型工作... – FlorianTopf

1

如果你不想做一個新的類擴展請求您可以訪問請求,像一個對象:

req['decoded'] = decoded; 

如果劇照拋出你,你可能要投REQ作爲對象(打字稿):

(<Object>req)['decoded'] = decoded; 

你甚至可以投REQ鍵入任何和訪問解碼財產(打字稿):

(<any>req).decoded = decoded; 
0

這個錯誤意味着來自express的原始Request類型不具有該名稱的任何字段。

你有兩個選擇來解決這個問題,第一個作爲Vadim Macagon指出,你可以創建一個聲明模塊文件並添加你的自定義字段,這樣可以使字段在每個請求上都可用。

declare module Express { 
    export interface Request { 
    decoded: string; 
    // etc. 
    } 
} 

選擇二,你可以創建一個擴展原始請求的自定義界面,並添加您的解碼領域。

export default interface ICustomRequest extends Request { 
    token: string; 
} 

,然後在你的代碼中

app.post('/', function (req: ICustomRequest, res) { 
    req.decoded = decoded; // No errors here 
}); 

第一個解決方案你「並稱」自定義字段爲Request,你是第二個添加字段,並從申請延長。

在你的情況我會使用第一個解決方案,以避免編寫ICustomRequest(或任何名稱你選擇),每一個你必須使用從您的要求decoded領域,文件.d.ts不需要要導入您的時間代碼,以便您可以創建該文件並完成。

相關問題