2017-05-10 15 views
4

私は自分のコードにexpress(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で型キャストは存在しないが型アサーションを読んでいるので、オブジェクトが型xであることをコンパイラに伝えるだけなので...間違っていますか?これを行う方法は何ですか?ありがとう。

+1

「動作していません」と定義してください。正確である。エラーはありますか?どれ?コンパイル時に?実行時に?何が起こるのですか? –

+0

実行時に、私が渡すオブジェクトがあれば、コードは正常に実行されます。 –

+0

あなたが何を求めているのかはっきりしない –

答えて

7

JavaScriptがキャストされていないので、「キャストに失敗しました」とスローすることはできません。
活字体supports castingが、それは唯一のコンパイル時のためだ、とあなたはこのようにそれを行うことができます。

const toDo = <IToDoDto> req.body; 
// or 
const toDo = req.body as IToDoDto; 

値が有効とエラーがスローされていない場合である場合、すなわち、実行時にチェックすることができます。

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(); 
} 
関連する問題