web-dev-qa-db-ja.com

TypeScript isNanは数字のみを受け入れます

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;
            }
29
Alon

コードを異なる方法で実装することをお勧めします。
理由:

  1. 短いかもしれませんが、何が起こっているのかを理解するのは簡単ではありません
  2. ここではisNaNを使用するのが最適なオプションではありません。isNaN("")falseも返します

値を数値に変換し、それがNaNであるかどうかを確認することをお勧めします(@smnbbrvが書いたように)。

if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) {
    expectedValue = Number(expectedValue);
}

編集

値をanyとして渡すことができます:

isNaN(ctualValue as any)

コンパイラーチェックをバイパスします。

24
Nitzan Tomer

これがJavaScriptの仕組みであるため、解決すべきではありません。

入力を最初に数値にキャストするだけです

Number("10") // 10
Number("abc") // NaN

次に、isNan関数を使用して結果を確認します。

isNaN(Number("abc"))
9
smnbbrv

これは、isNaN内でparseIntを使用して解決できます。 parseIntがNaNを返す場合、isNaNチェックは引き続き機能します。そして、TypeScriptエラーが解決されます。

if (typeof actualValue === "string" && !isNaN(parseInt(actualValue, 10))) {
  actualValue = +actualValue;
}
1
Ellaji
0
laser

まず、number型の値のみがNaNになります。そのため、静的コンテキストが値がたとえばstring型であることを示している場合、それはNaNではないことを確認できます。タイプ_string|number_の値がある場合(これは避けてください)、これをどのように処理するかを決定できます。厳密に言えば、NaNは浮動小数点数のIEEE標準で指定されている特定の値であるため、文字列値_"foo"_はNaNではありません。ただし、javascriptでは、関数 文字列を数値に変換する が最初であり、その結果、NaNになるため、isNaN("foo")はtrueになります。 TypeScriptはここで型を利用しようとしますが、isNaNを使用すべきではない場所で使用できないようにします。

0
Tamas Hegedus