2017-12-13 2 views
0

Restify (Restify를 모르는 경우 Express.js로 간주)로 작업하고 있으며 요청 개체에 개체를 연결하여 개체에 액세스 할 수 있습니다. 다음 노선.클래스 개체의 typedefition을 확장하십시오.

더 구체적인 예 : req.user = data; 타이프 라이터 분명 나에게 소리지르이 라인에서

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: {}; 인 계속 사용할 수 있도록 restype 네임 스페이스에있는 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

관련 문제