WebStorm 2016.2.2、TypeScript 2.1、Node.jsを使用しています。
何らかの理由で、isNan
は、数値のみを受け入れる関数として宣言されます。
declare function isNaN(number: number): boolean;
いずれかに変更しようとしましたが、TSCに影響を与えないようです。私はまだ同じエラーを受け取ります:
タイプ 'string'の引数は、タイプ 'number'のパラメーターに割り当てることができません
私のコード(簡略化):
isNan("10");
どうすれば解決/回避できますか?
編集:
仕様によると、isNanのパラメーターは任意のタイプにできます。 Number.isNan()
また、コードが簡素化されました。私は実際に文字列または数値のいずれかである可能性のあるパラメータを受け取ります。それが文字列の場合は、数値に変換したい文字列の数値(「10」)または単純な文字列(「Hello world」) 。
私はコード全体を含めることでこの質問を長くしたくはありませんでしたが、混乱を招くため、これが私の本当のコードです。
if (typeof expectedValue === "string" && !isNaN(expectedValue)) {
expectedValue = +expectedValue;
}
if (typeof actualValue === "string" && !isNaN(ctualValue)) {
actualValue = +actualValue;
}
switch (this.operator) {
case Operator.equal:
return actualValue == expectedValue;
case Operator.notEqual:
return actualValue === undefined || actualValue != expectedValue;
case Operator.greaterThan:
return actualValue > expectedValue;
case Operator.littleThan:
return actualValue < expectedValue;
case Operator.greaterOrEqual:
return actualValue >= expectedValue;
case Operator.littleOrEqual:
return actualValue <= expectedValue;
}
コードを異なる方法で実装することをお勧めします。
理由:
isNaN
を使用するのが最適なオプションではありません。isNaN("")
はfalse
も返します値を数値に変換し、それがNaN
であるかどうかを確認することをお勧めします(@smnbbrvが書いたように)。
if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) {
expectedValue = Number(expectedValue);
}
値をany
として渡すことができます:
isNaN(ctualValue as any)
コンパイラーチェックをバイパスします。
これがJavaScriptの仕組みであるため、解決すべきではありません。
入力を最初に数値にキャストするだけです
Number("10") // 10
Number("abc") // NaN
次に、isNan関数を使用して結果を確認します。
isNaN(Number("abc"))
これは、isNaN内でparseIntを使用して解決できます。 parseIntがNaNを返す場合、isNaNチェックは引き続き機能します。そして、TypeScriptエラーが解決されます。
if (typeof actualValue === "string" && !isNaN(parseInt(actualValue, 10))) {
actualValue = +actualValue;
}
グローバルスコープ関数isFinite()
を使用できます... Number.isFinite()
は使用しないでください
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
まず、number
型の値のみがNaN
になります。そのため、静的コンテキストが値がたとえばstring
型であることを示している場合、それはNaN
ではないことを確認できます。タイプ_string|number
_の値がある場合(これは避けてください)、これをどのように処理するかを決定できます。厳密に言えば、NaN
は浮動小数点数のIEEE標準で指定されている特定の値であるため、文字列値_"foo"
_はNaN
ではありません。ただし、javascriptでは、関数 文字列を数値に変換する が最初であり、その結果、NaN
になるため、isNaN("foo")
はtrueになります。 TypeScriptはここで型を利用しようとしますが、isNaN
を使用すべきではない場所で使用できないようにします。