"sconosciuto" vs. "qualsiasi"


190

TypeScript 3.0 introduce il unknowntipo, secondo il loro wiki:

unknown è ora un nome di tipo riservato, in quanto ora è un tipo incorporato. A seconda dell'uso previsto di sconosciuto, è possibile che si desideri rimuovere completamente la dichiarazione (favorendo il tipo sconosciuto appena introdotto) o rinominarla in qualcos'altro.

Qual è la differenza tra unknowne any? Quando dovremmo usare unknownoltre any?

Risposte:


235

Puoi leggere di più unknownnel PR o nell'annuncio RC , ma l'essenziale è:

[..] sconosciuto che è la controparte sicura di qualsiasi tipo. Tutto è assegnabile a sconosciuto, ma sconosciuto non è assegnabile a nulla tranne se stesso e nessuno senza un'asserzione di tipo o un restringimento basato sul flusso di controllo. Allo stesso modo, nessuna operazione è consentita su uno sconosciuto senza prima affermare o restringere un tipo più specifico.

Alcuni esempi:

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'uso suggerito è:

Ci sono volte in cui vogliamo descrivere il tipo meno capace in TypeScript. Questo è utile per le API che vogliono segnalare "questo può essere qualsiasi valore, quindi è necessario eseguire un tipo di controllo prima di utilizzarlo". Ciò costringe gli utenti a introspettare in sicurezza i valori restituiti.


36
Chiunque provenga dallo sfondo C #, anyè simile dynamiced unknownè simile object. Mi piace unknownin quanto è solo più sicuro. Nomi confusi però.
nawfal,

1
Non so che questa è una cosa giusta da confrontare unknowne object@nawfal, anche se penso di vedere cosa stai ottenendo in termini di contravarianza e covarianza (ad es. Qualsiasi oggetto è assegnabile al tipo objectanche se per unknownqualsiasi oggetto o primitiva può essere assegnato - allo stesso modo unknownpuò essere assegnato a anyse stesso e objectpotrebbe essere assegnato a dynamicse stesso). In una nota a margine non sono chiaro il motivo per cui i documenti TS si riferiscono a unknownun tipo top perché in realtà non contiene tutti i tipi ¯_ (ツ) _ / ¯
Giordania,

38

La differenza tra sconosciuto e any è descritta come:

Proprio come any, qualsiasi valore è assegnabile a unknown; tuttavia, a differenza any, non è possibile accedere a nessuna proprietà sui valori con il tipo unknown, né è possibile chiamarli / costruirli. Inoltre, i valori di tipo unknownpossono essere assegnati solo a unknowno any.

Per rispondere alla tua domanda di quando si dovrebbe usare unknownpiù di any:

Questo è utile per le API che vogliono segnalare "questo può essere qualsiasi valore, quindi è necessario eseguire un tipo di controllo prima di utilizzarlo". Ciò costringe gli utenti a introspettare in sicurezza i valori restituiti.

Dai un'occhiata all'annuncio di TypeScript 3.0 per esempi di tipo che controllano una variabile di tipo unknowne una spiegazione più dettagliata.


21

any genere:

Il anytipo rappresenta tutti i possibili valori JS. Ogni tipo è assegnabile al tipo any. Pertanto il tipo anyè un supertipo universale del sistema dei tipi. Il compilatore TS consentirà qualsiasi operazione sui valori digitati any. Per esempio:

let myVar: any;

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

In molte occasioni questo è troppo indulgente per il compilatore TS. cioè consentirà operazioni che avremmo potuto sapere come risultanti in un errore di runtime.

unknown genere:

Il unknowntipo rappresenta (proprio come any) tutti i possibili valori JS. Ogni tipo è assegnabile al tipo unknown. Pertanto il tipo unknownè un altro supertipo universale del sistema dei tipi (a fianco any). Tuttavia, il compilatore TS non consentirà alcuna operazione sui valori digitati unknown. Inoltre, il unknowntipo è assegnabile solo al tipo any. Un esempio chiarirà questo:

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.