web-dev-qa-db-fra.com

'inconnu' contre 'aucun'

TypeScript 3.0 introduit le type unknown, en fonction de leur wiki:

unknown est maintenant un nom de type réservé, car il s'agit maintenant d'un type intégré. En fonction de votre utilisation envisagée d’inconnu, vous pouvez supprimer entièrement la déclaration (en privilégiant le type inconnu nouvellement introduit) ou la renommer en un autre nom.

Quelle est la différence entre unknown et any? Quand devrions-nous utiliser unknown sur any?

85
Jacoslaw

Vous pouvez en savoir plus sur unknown dans le PR ou le annonce RC , mais son contenu est le suivant:

[..] unknown qui est la contrepartie type de any. Tout ce qui est assignable à inconnu, mais inconnu ne peut pas être attribué à lui-même et sans assertion de type ou rétrécissement basé sur un flux de contrôle. De même, aucune opération sur une inconnue n'est autorisée sans affirmation préalable ou réduction à un type plus spécifique.

Quelques exemples:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

L'utilisation suggérée est:

Il arrive souvent que nous voulions décrire le type le moins capable dans TypeScript. Ceci est utile pour les API qui souhaitent signaler "ceci peut être n'importe quelle valeur, vous devez donc effectuer un type de vérification avant de l'utiliser". Cela oblige les utilisateurs à introspecter en toute sécurité les valeurs renvoyées.

121

La différence entre unknown et any est décrite comme suit:

Tout comme any, toute valeur est assignable à unknown; Cependant, contrairement à any, vous ne pouvez accéder à aucune propriété de valeur de type unknown, vous ne pouvez pas non plus les appeler ni les construire. De plus, les valeurs de type unknown ne peuvent être attribuées qu'à unknown ou any.

Pour répondre à votre question de savoir quand utiliser unknown sur any:

Ceci est utile pour les API qui veulent signaler "ceci peut être n'importe quelle valeur, de sorte que vous devez effectuer un type de vérification avant de l'utiliser". Cela oblige les utilisateurs à introspecter en toute sécurité les valeurs renvoyées.

Examinez le Annonce TypeScript 3. pour consulter des exemples de vérification de type d'une variable de type unknown et une explication plus détaillée.

19
Awad Maharoof

any type:

Le type any représente toutes les valeurs JS possibles. Chaque type est assignable au type any. Par conséquent, le type any est un supertype universel du système de types. Le compilateur TS autorisera toute opération sur les valeurs typées any. Par exemple:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

Cela est souvent trop indulgent pour le compilateur TS. c’est-à-dire que cela permettra des opérations dont nous aurions pu être au courant, entraînant une erreur d’exécution.

unknown type:

Le type unknown représente (tout comme any) toutes les valeurs JS possibles. Chaque type est assignable au type unknown. Par conséquent, le type unknown est un autre surtype universel du système de types (à côté de any). Cependant, le compilateur TS non autorise toute opération sur les valeurs typées unknown. De plus, le type unknown ne peut être affecté qu'au type any. Un exemple clarifiera ceci:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
3