Tipos Anulables
JavaScript tiene dos formas de declarar valores que no
existen, y TypeScript agrega sintaxis adicional lo que
permite aun más formas de declarar algo como opcional o
anulable.
Primero, la diferencia entre ambas primitivas de
JavaScript: undefined y null.
La primitiva indefinida `undefined` es cuando algo no
puede ser encontrado o modificado.
const emptyObj = {};
const anUndefinedProperty: undefined = emptyObj["anything"];
// La primitiva nula `null` está destinada a ser usada
cuando hay una falta consciente de un valor.
const searchResults = {
video: { name: "LEGO Movie" },
text: null,
audio: { name: "LEGO Movie Soundtrack" },
};
// ¿Por qué no usar undefined? Principalmente, porque ahora
puedes verificar que la propiedad text se haya incluido
correctamente. Si la propiedad text se devuelve como
undefined, el resultado es el mismo que si no estuviera
allí.
Esto puede parecer un poco superficial, pero cuando se
hace la conversión a una cadena JSON, si la propiedad
text era undefined, esta no podria ser incluida en la
cadena de texto equivalente.
Tipos Anulables Estrictos
Antes de TypeScript 2.0, las primitivas undefined y null
eran ignoradas en el sistema de tipado. Esto permitió que
TypeScript proporcionará un entorno de codificación más
cercano a JavaScript sin tipado.
La versión 2.0 agregó una opción de compilador llamada
"strictNullChecks" y esta opción requería que los
usuarios tratasen undefined y null como tipos que deben
ser manejados por medio de análisis de flujo de código
( Ver más en example:code-flow )
Para ver un ejemplo de la diferencia en activar la opción
de verificación estricta de tipos nulos en TypeScript,
desplaza el cursor sobre "PotentialString" a
continuación:
type PotentialString = string | undefined | null;
// La variable PotentialString descarta el valor undefined y
null. Si vas al panel de configuración, y activas el modo
estricto, al regresar al código, verás que al pasar por
PotentialString ahora se muestra la unión completa de
tipos.
declare function getID(): PotentialString;
const userID = getID();
console.log("User Logged in: ", userID.toUpperCase());
// Lo anterior fallará solamente en modo estricto ^
// Existen maneras de decirle a TypeScript que sabes lo que
haces, como por ejemplo una aserción de tipo o mediante
un operador de aserción no nulo (!)
const definitelyString1 = getID() as string;
const definitelyString2 = getID()!;
// O puedes verificar de manera segura por la existencia del
valor utilizando un condicional if:
if (userID) {
console.log(userID);
}
// Propiedades Opcionales
// Void
// Void es el tipo que retorna una función que no devuelve
un valor.
const voidFunction = () => {};
const resultOfVoidFunction = voidFunction();
// Esto es usualmente un accidente, y TypeScript mantiene el
tipo vacío para permitirle obtener errores del compilador,
aunque en tiempo de ejecución sería undefined.