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.
// La primitiva nula `null` está destinada a ser usada
cuando hay una falta consciente de un valor.
const emptyObj = {};
const anUndefinedProperty: undefined = emptyObj["anything"];
// ¿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:
const searchResults = {
video: { name: "LEGO Movie" },
text: null,
audio: { name: "LEGO Movie Soundtrack" },
};
// 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.
type PotentialString = string | undefined | null;
// 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 (!)
declare function getID(): PotentialString;
const userID = getID();
console.log("User Logged in: ", userID.toUpperCase());
// Lo anterior fallará solamente en modo estricto ^
// O puedes verificar de manera segura por la existencia del
valor utilizando un condicional if:
const definitelyString1 = getID() as string;
const definitelyString2 = getID()!;
// Void es el tipo que retorna una función que no devuelve
un valor.
if (userID) {
console.log(userID);
}
// Propiedades Opcionales
// Void
// 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.
const voidFunction = () => {};
const resultOfVoidFunction = voidFunction();