2017-02-27 6 views
0

私は非常に単純な状況があり、困惑しています。私は、明示的なhttp get関数にパラメータを渡しています。クエリで使用されているので、数値であることを確認しています(SQLインジェクションから安全です)。未定義の数字(文字列からのキャスト)ヌルチェックが終了しました

クライアントのデータ構造上、これらの数値は文字列に変換されます。だから私は誤って数字の代わりに文字列を渡した。 invoiceIdが未定義に評価され、クエリが失敗したため、アプリケーションが正常に動作しませんでした。

これを防ぐために、私はヌルチェックを追加しました。以下は実際の例です(文字列を数値にキャストするコンパイルエラーはありません):

(値が文字列値 "undefined"として渡されていたことに注意してください。まだtypescriptですがinvoiceIdが、それは数あるべきな文字列値であるかどうかをチェックするから私を禁止としてそれをキャッチすることができないという問題を持っている。私はis施行タイプを想定し!)

class IBadInput { value: any }; 

var badInput = { value: "undefined" } as IBadInput; 
var invoiceId = badInput.value as number; 

if (typeof invoiceId == 'undefined' || invoiceId == null) 
{ 
    console.log("inoice id not provided"); 
} 

console.log("getting for invoice", invoiceId); 

しかし、どこ状況に文字列invoiceIdが提供されますが、invoiceId == null文はトリガーされません。これが出力されます。

getting for invoice undefined 

私はそれが「truthy」ですが、すべては、このチェックに合格した者の取得かどうかをチェックするためにinvoiceId == undefinedをチェックしてみました、とtypeof invoiceId == nullだけif(invoiceId)てきました。

私はそれを捕まえることができますか?

+2

'' typeof invoiceId == 'undefined'''はどうですか? – Ditto

+0

http://stackoverflow.com/questions/27509/detecting-an-undefined-object-property – david25272

+0

私は、あなたが主張していることが実際に起こっている可能性があると信じています。それは本当にあなたのコードがどのように見えるのでしょうか? '=='演算子は、 'undefined'と' null'を等しく扱うように明示的に定義されています。あなたが主張しているのは、あなたのJavaScriptランタイムは、言語の非常に基本的な部分に重大なバグを持ち、それは単に疑わしいと思うということです。 – Pointy

答えて

1

typescriptは、invoiceIdが数字である必要があるため、文字列の値であるかどうかをチェックすることを禁止しています。

値がタイプnumberであるか、nullの値であるかどうかをチェックする方法があります。

let input: any = "Some string"; 
let invoiceId = input as number; 

if (typeof invoiceId !== 'number' || invoiceId === null) 
{ 
    document.write(invoiceId.toString() + ' is of type ' + (typeof invoiceId)); 
    document.write(" and needs to be a non-null value of type number.") 
} 

出力:

Some string is of type string and needs to be of type number. 

任意のアイデアなぜ...

番号へのキャストは、コンパイル時にのみ起こると、実行時には影響を与えません。クライアントアプリケーションが実行時に文字列を入力すると、変数は実行時に文字列になりますが、typeof undefinedでもnullでもありません。

詳しくはrunning the above in TypeScript playをご覧ください。

関連する問題