web-dev-qa-db-fra.com

TypeScript isNan n'accepte qu'un nombre

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

Je vous conseille d'implémenter votre code différemment.
Les raisons:

  1. C'est peut-être court, mais ce n'est pas facile de comprendre ce qui se passe
  2. L'utilisation de 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);
}

Modifier

Vous pouvez transmettre votre valeur sous la forme any:

isNaN(ctualValue as any)

Pour contourner la vérification du compilateur.

24
Nitzan Tomer

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"))
9
smnbbrv

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;
}
1
Ellaji
0
laser

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.

0
Tamas Hegedus