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

Ответ 1

Я советую вам реализовать свой код по-разному.
Причины:

  1. Это может быть коротко, но нелегко понять, что происходит
  2. Использование isNaN - не лучший вариант здесь: isNaN("") возвращает false

Лучше попробуйте преобразовать значение в число и проверьте, не NaN или нет (как писал @smnbbrv):

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

редактировать

Вы можете передать свое значение как any:

isNaN(ctualValue as any)

Чтобы обойти проверку компилятора.

Ответ 2

Вы не должны его решать, потому что это работает JavaScript.

Просто сначала введите ввод в число

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

а затем проверить результат с помощью функции isNan:

isNaN(Number("abc"))

Ответ 3

Вы можете решить эту проблему, используя parseInt внутри вашего isNaN. Проверка isNaN будет по-прежнему работать, если parseInt возвращает NaN. И ваша ошибка Typescript будет решена.

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

Ответ 5

Прежде всего, только значения number типа могут быть NaN. Поэтому, если статический контекст говорит вам, что ваше значение имеет string типа, например, вы можете быть уверены, что это не NaN. Если у вас есть значение с типом string|number (чего следует избегать btw), вы все равно можете решить, как вы справляетесь с этим. Строго говоря, строковое значение "foo" не является NaN, так как NaN - это конкретное значение, указанное в стандарте IEEE для чисел с плавающей запятой. Но все же, в javascript, isNaN("foo") будет true, поскольку функция сначала будет коаксировать строку на число, а это коэрцитирование приводит к NaN. Typcript пытается использовать типы здесь, он пытается помешать вам использовать isNaN где вы не должны.