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
Я советую вам реализовать свой код по-разному.
Причины:
- Это может быть коротко, но нелегко понять, что происходит
- Использование
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;
}
Ответ 4
Вы можете использовать глобальную функцию 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
Ответ 5
Прежде всего, только значения number
типа могут быть NaN
. Поэтому, если статический контекст говорит вам, что ваше значение имеет string
типа, например, вы можете быть уверены, что это не NaN
. Если у вас есть значение с типом string|number
(чего следует избегать btw), вы все равно можете решить, как вы справляетесь с этим. Строго говоря, строковое значение "foo"
не является NaN
, так как NaN
- это конкретное значение, указанное в стандарте IEEE для чисел с плавающей запятой. Но все же, в javascript, isNaN("foo")
будет true, поскольку функция сначала будет коаксировать строку на число, а это коэрцитирование приводит к NaN
. Typcript пытается использовать типы здесь, он пытается помешать вам использовать isNaN
где вы не должны.