2017-10-18 1 views
1

J'utilise tapuscrit pour écrire le programme NodeJS.La propriété n'existe pas sur la valeur de retour d'une fonction de plusieurs types

Dans ce programme, j'importer un module de nœud appelé ts-md5, dans lequel il y a une fonction hashStr(), il pourrait retourner une valeur de string ou Int32Array.

je dois faire des choses comme ça dans mon programme:

Md5.hashStr(str).toUpperCase(); 

Cependant, le compilateur se plaint d'erreur:

error TS2339: Property 'toUpperCase' does not exist on type 'string | Int32Array'. 

Le programme se déroule avec succès. Parce qu'il renvoie toujours string pendant l'exécution. Mais je veux savoir s'il existe un moyen de se débarrasser de cette erreur ennuyeuse?

Répondre

2

Vous pouvez utiliser une protection de type ou une assertion de type.

Type garde

let hash = Md5.hashStr(str); 
if (typeof hash === 'string') { 
    hash = hash.toUpperCase(); 
} 

affirmation de type

let hash = (<string>Md5.hashStr(str)).toUpperCase(); 

L'avantage de la garde de type est techniquement plus sûr - car si vous avez obtenir quelque chose qui n » était pas t une chaîne à l'exécution, cela fonctionnerait toujours. L'assertion de type est simplement que vous surchargez le compilateur, donc ce n'est pas techniquement aussi sûr, mais il est entièrement effacé et par conséquent résulte dans le même code d'exécution que vous avez au moment où vous avez l'erreur.

+0

Les deux méthodes fonctionnent, et la méthode * type guard * fournit une solution sûre, dans laquelle je peux traiter les deux types de retour. –

1

hashStr est declared ints-md5 typages comme

static hashStr(str: string, raw?: boolean): string | Int32Array; 

En regardant the implementation, est semble qu'il retourne Int32Array quand raw est vrai, et retourne string autrement.

Étant donné cette déclaration, vous ne pouvez pas faire beaucoup mieux que l'affirmation de type d'utilisation:

let hash = (Md5.hashStr(str) as string).toUpperCase() 

La bonne façon d'exprimer ce type de retour est fonction du paramètre dactylographiée est via overload declarations. Quelque chose comme ceci devrait fonctionner:

static hashStr(str: string): string; 
static hashStr(str: string, raw: false): string; 
static hashStr(str: string, raw: true): Int32Array; 
static hashStr(str: string, raw: boolean): Int32Array | string; 
static hashStr(str: string, raw?: boolean): string | Int32Array { 
    // implementation goes here... 
} 

Je suggérerais de signaler un problème avec ts-md5 à ce sujet.

+0

Explication très détaillée et utile. Merci. J'accepte une autre réponse car elle permet de gérer les deux types de retour, pour éviter les erreurs d'exécution. –