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
?
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.
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 typeunknown
, vous ne pouvez pas non plus les appeler ni les construire. De plus, les valeurs de typeunknown
ne peuvent être attribuées qu'àunknown
ouany
.
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.
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();