2017-05-10 1 views
4

익스프레스 (body-parser 미들웨어 사용)의 요청 본문에서 인터페이스로 캐스트하려고하지만 작동하지 않습니다. 이 작업을 수행 할 수 있습니까?TypeScript의 인터페이스 객체에 캐스트 캐스트

@Post() 
addToDo(@Response() res, @Request() req) { 
    const toDo: IToDoDto = <IToDoDto> req.body; 
    this.toDoService.addToDo(toDo); 
    return res.status(HttpStatus.CREATED).end(); 
} 

그리고 마지막으로, 서비스 메서드 호출되는 것 :

export interface IToDoDto { 
    description: string; 
    status: boolean; 
}; 

이 내가 캐스트를 할 노력하고있어 코드입니다 :

내 인터페이스
public addToDo(toDo: IToDoDto): void { 
    toDo.id = this.idCounter; 
    this.todos.push(toDo); 
    this.idCounter++; 
} 

모든 인수를 전달할 수 있으며 정상적으로 작동합니다. 나는 TypeScript에서 casting하지만 Type Assertion이 존재하지 않는다는 것을 읽었습니다. 그래서 컴파일러에게 객체 타입이 x라는 것을 알려줄 것입니다. 그리고 이것을하는 방법은 무엇입니까? 감사.

+1

"작동하지 않는다"고 정의하십시오. 정확 해. 오류가 있습니까? 어느 것? 컴파일 타임에? 런타임시에? 무슨 일이야? –

+0

런타임에 코드는 내가 통과 한 객체와 함께 정상적으로 실행됩니다. –

+0

당신이 무엇을 요구하는지 분명하지 않다 –

답변

7

자바 스크립트에는 캐스팅이 없으므로 "캐스팅 실패"하면 던질 수 없습니다.
타이프 라이터 supports casting 그러나 그것은 단지 컴파일 시간을, 그리고 당신이 이런 식으로 작업을 수행 할 수 있습니다

function isToDoDto(obj: any): obj is IToDoDto { 
    return typeof obj.description === "string" && typeof obj.status === "boolean"; 
} 

@Post() 
addToDo(@Response() res, @Request() req) { 
    if (!isToDoDto(req.body)) { 
     throw new Error("invalid request"); 
    } 

    const toDo = req.body as IToDoDto; 
    this.toDoService.addToDo(toDo); 
    return res.status(HttpStatus.CREATED).end(); 
} 
: 값이 유효하고 있지 않은 경우하는 오류, 즉 던져 경우 런타임에 확인하실 수 있습니다
const toDo = <IToDoDto> req.body; 
// or 
const toDo = req.body as IToDoDto;