Je travaille avec WebStorm 2016.2.2, TypeScript 2.1, Node.js.
Pour une raison quelconque, isNan
est déclaré comme une fonction qui accepte uniquement un nombre:
declare function isNaN(number: number): boolean;
J'ai essayé de le changer en n'importe quel, mais il semble que cela n'influence pas le TSC. Je reçois toujours la même erreur:
L'argument de type 'chaîne' n'est pas attribuable au paramètre de type 'numéro'
Mon code (simplifié):
isNan("10");
Comment puis-je le résoudre/contourner?
Modifier:
Notez que selon les spécifications, le paramètre isNan peut être de n'importe quel type: Number.isNan ()
Aussi: Mon code a été simplifié. En fait, je reçois un paramètre qui peut être une chaîne ou un nombre, et s'il s'agit d'une chaîne, il peut s'agir d'un nombre filandreux que je voudrais convertir en nombre ("10") ou en une chaîne simple ("Hello world") .
Je ne voulais pas poser cette question longtemps en incluant tout mon code, mais parce que cela a causé de la confusion, voici mon vrai code:
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;
}
Je vous conseille d'implémenter votre code différemment.
Les raisons:
isNaN
n'est pas la meilleure option ici: isNaN("")
renvoie également false
Vous feriez mieux d'essayer de convertir la valeur en nombre et de vérifier si c'est NaN
ou non (comme l'a écrit @smnbbrv):
if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) {
expectedValue = Number(expectedValue);
}
Vous pouvez transmettre votre valeur sous la forme any
:
isNaN(ctualValue as any)
Pour contourner la vérification du compilateur.
Vous ne devez pas le résoudre car c'est ainsi que JavaScript fonctionne.
Il suffit de lancer l'entrée au numéro en premier
Number("10") // 10
Number("abc") // NaN
puis vérifiez le résultat avec la fonction isNan:
isNaN(Number("abc"))
Vous pouvez résoudre ce problème en utilisant parseInt dans votre isNaN. La vérification isNaN fonctionnera toujours si le parseInt renvoie NaN. Et votre erreur TypeScript sera résolue.
if (typeof actualValue === "string" && !isNaN(parseInt(actualValue, 10))) {
actualValue = +actualValue;
}
Vous pouvez utiliser la fonction de portée globale isFinite()
... n'utilisez pas 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
Tout d'abord, seules les valeurs de type number
peuvent être NaN
. Ainsi, si le contexte statique vous indique que votre valeur est de type string
par exemple, vous pouvez être sûr qu'il ne s'agit pas d'un NaN
. Si vous avez une valeur avec le type string|number
(Qui devrait être évité btw), vous pouvez toujours décider comment vous allez gérer cela. À strictement parler, la valeur de chaîne "foo"
N'est pas NaN
, car NaN
est une valeur spécifique spécifiée dans la norme IEEE pour les nombres flottants. Mais toujours, en javascript, isNaN("foo")
sera vrai, car la fonction coérectera la chaîne à un nombre d'abord, et cette coerection se traduira par un NaN
. TypeScript essaie de tirer parti des types ici, il essaie de vous empêcher d'utiliser isNaN
là où vous ne devriez pas.