前提・実現したいこと
TypeScriptの例外処理を強制させる方法について教えてください。
書籍「プログラミングTypeScript――スケールするJavaScriptアプリケーション開発」
上記の書籍にやり方が書かれていたのですが、実際試すと強制させることをうまく実現させることができません。
上記の書籍の例外の章に以下のような説明が書かれていました。
TypeScript
1function parse( 2 birthDay: string 3): Date | InvalidDateFormatError | DateIsInTheFutureError { 4 let date = new Date(birthDay); 5 if (!isValid(date)) { 6 **throw** new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 7 } 8 if (date.getTime() > Date.now()) { 9 **throw** new DateIsInTheFutureError("未来の日付です"); 10 } 11 return date; 12}
上記のソースコードにおいて、ifがtrueの時(エラーの際)、例外を発生させるというプログラムだが、
・throw new InvalidDateFormatError("形式は yyyy/MM/ddにしてください");
というthrow文だと呼び出しもとでtry/catchを書かなければプログラムが途中で止まってしまう。
ただ呼び出しもとでtry/catchを強制させることができない。
そのためthrowではなく以下のようにreturnを使うべきだとのこと。
TypeScript
1function parse( 2 birthDay: string 3): Date | InvalidDateFormatError | DateIsInTheFutureError { 4 let date = new Date(birthDay); 5 if (!isValid(date)) { 6 return new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 7 } 8 if (date.getTime() > Date.now()) { 9 return new DateIsInTheFutureError("未来の日付です"); 10 } 11 return date; 12}
・TypeScriptはJavaではないためthrows節はサポートしていないため例外処理を強制させるために
上記のソースコードのようにthrowではなく、returnで例外を返すようにすると、呼び出しもとでは、
全ての例外を処理する処理を書かなければコンパイル時にTypeErrorとなる
【質問】
やりたいことは、上記のparse()関数でエラーが発生した(if文の条件がtrueの)際に、例外をthrowし、
呼び出しもとで例外処理を強制させたいです。(呼び出しもとで例外処理をしていないとコンパイルエラーにしたい)
上記のように書いてもそれができないため、その方法をご教授いただけませんでしょうか。
発生している問題・エラーメッセージ
実際に書籍に書かれているコードを試しましたが(下記に記載されているコード)、
書籍に書かれているような例外を処理する処理を書いていなくてもTypeError(コンパイルエラー)に
なることがない。
コンパイルエラーにならない
該当のソースコード
TypeScript
1class InvalidDateFormatError extends RangeError {} 2class DateIsInTheFutureError extends RangeError {} 3 4function parse( 5 birthDay: string 6): Date | InvalidDateFormatError | DateIsInTheFutureError { 7 let date = new Date(birthDay); 8 if (!isValid(date)) { 9 return new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 10 } 11 if (date.getTime() > Date.now()) { 12 return new DateIsInTheFutureError("未来の日付です"); 13 } 14 return date; 15} 16 17function isValid(date: Date) { 18 return ( 19 Object.prototype.toString.call(date) === "[object Date]" && 20 !Number.isNaN(date.getTime()) 21 ); 22} 23 24let result = parse("2979/07/27"); 25console.log(result); 26
試したこと
実際に書籍発行元のオライリーに問い合わせをしているのですが、
一向に返信をいただけず、こちらに質問させていただくことにしました。
お願い致します。
補足情報(FW/ツールのバージョンなど)
VSCode
回答2件
あなたの回答
tips
プレビュー