'desconocido' versus 'cualquiera'


190

TypeScript 3.0 introduce el unknowntipo, de acuerdo con su wiki:

desconocido ahora es un nombre de tipo reservado, ya que ahora es un tipo incorporado. Dependiendo de su uso previsto de desconocido, es posible que desee eliminar la declaración por completo (favoreciendo el tipo desconocido recién introducido), o cambiarle el nombre a otra cosa.

¿Cuál es la diferencia entre unknowny any? ¿Cuándo debemos usar unknownmás any?

Respuestas:


233

Puede leer más sobre unknownel anuncio de relaciones públicas o RC , pero lo esencial es:

[..] se desconoce cuál es la contraparte de tipo seguro de cualquiera. Cualquier cosa se puede asignar a desconocido, pero desconocido no se puede asignar a nada más que a sí mismo y a cualquiera sin una aserción de tipo o un estrechamiento basado en el flujo de control. Del mismo modo, no se permiten operaciones en un desconocido sin primero afirmar o reducir a un tipo más específico.

Unos pocos ejemplos:

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

El uso sugerido es:

Muchas veces queremos describir el tipo menos capaz en TypeScript. Esto es útil para las API que desean indicar "esto puede ser cualquier valor, por lo que debe realizar algún tipo de verificación antes de usarlo". Esto obliga a los usuarios a introspectar de forma segura los valores devueltos.


35
Cualquiera que venga de C # de fondo, anyes como dynamicy unknownes como object. Me gusta, unknownya que es más seguro. Aunque nombres confusos.
nawfal

1
No sé si es una comparación justa unknowny object@nawfal, aunque creo que veo a qué te refieres en términos de contravarianza y covarianza (por ejemplo, se puede asignar cualquier tipo objectde unknownobjeto, aunque se puede asignar cualquier objeto o primitivo - de manera similar unknownpuede asignarse a anysí mismo y objectpuede asignarse a dynamicsí mismo). En una nota al margen, no estoy claro por qué los documentos de TS se refieren unknowncomo un tipo superior porque realmente no contiene todos los tipos ¯_ (ツ) _ / ¯
Jordania

38

La diferencia entre desconocido y cualquiera se describe como:

Al igual que any, cualquier valor es asignable a unknown; sin embargo, a diferencia de any, no puede acceder a ninguna propiedad en valores con el tipo unknown, ni puede llamarlos / construirlos. Además, los valores de tipo unknownsolo se pueden asignar a unknowno any.

Para responder a su pregunta de cuándo debe usar unknownmás de any:

Esto es útil para las API que desean indicar "esto puede ser cualquier valor, por lo que debe realizar algún tipo de comprobación antes de usarlo". Esto obliga a los usuarios a introspectar con seguridad los valores devueltos.

Eche un vistazo al anuncio de TypeScript 3.0 para ver ejemplos de tipos que verifican una variable de tipo unknowny una explicación más detallada.


21

any tipo:

El anytipo representa todos los valores JS posibles. Cada tipo es asignable a escribir any. Por lo tanto, el tipo anyes un supertipo universal del sistema de tipos. El compilador de TS permitirá cualquier operación en valores escritos any. Por ejemplo:

let myVar: any;

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

En muchas ocasiones, esto es demasiado indulgente con el compilador de TS. es decir, permitirá operaciones que podríamos haber conocido como resultado de un error de tiempo de ejecución.

unknown tipo:

El unknowntipo representa (al igual que any) todos los valores JS posibles. Cada tipo es asignable a escribir unknown. Por lo tanto, el tipo unknownes otro supertipo universal del sistema de tipos (junto any). Sin embargo, el compilador de TS no permitirá ninguna operación en valores escritos unknown. Además, el unknowntipo solo se puede asignar al tipo any. Un ejemplo aclarará esto:

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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.