Literales
TypeScript tambien cuenta con algunos casos especiales
para los literales en el código fuente.
De hecho, gran parte del soporte está cubierto por la expansión
y redución de tipos ( example:type-widening-narrowing ) y vale
la pena hablar de ello primero.
Un literal es un subtipo más concreto de un tipo común.
Lo que esto significa es que "Hello World" es una cadena,
pero una cadena no es "Hello World" dentro del sistema de tipos.
// Esto te permite declarar APIs que usan uniones para decir
que solo acepta unos literales en particular.
const helloWorld = "Hello World";
let hiWorld = "Hi World"; // esto es una cadena porque se define con let
// Esta función acepta todas las cadenas
declare function allowsAnyString(arg: string);
allowsAnyString(helloWorld);
allowsAnyString(hiWorld);
// Esta función solo acepta la cadena literal "Hello World"
declare function allowsOnlyHello(arg: "Hello World");
allowsOnlyHello(helloWorld);
allowsOnlyHello(hiWorld);
// Notesé como transforma `name: "Sabrina"` a `name: string`
aún cuando está definida como una constante. Esto se debe
a que el nombre todavía puede cambiar en cualquier momento:
declare function allowsFirstFiveNumbers(arg: 1 | 2 | 3 | 4 | 5);
allowsFirstFiveNumbers(1);
allowsFirstFiveNumbers(10);
let potentiallyAnyNumber = 3;
allowsFirstFiveNumbers(potentiallyAnyNumber);
// A primera vista, esta regla no se aplica a los objetos complejos.
const myUser = {
name: "Sabrina",
};
// Debido a que la propiedad `name` de `myUser` puede cambiar,
TypeScript no puede usar la versión literal en el sistema
de tipos. Sin embargo, hay una característica que le permitirá
hacer esto.
myUser.name = "Cynthia";
// Cuando se aplica "as const" al objeto, entonces se convierte
en un objeto literal que no cambia a diferencia de un objeto
mutable que sí puede.
const myUnchangingUser = {
name: "Fatma",
} as const;
// "as const" es una gran herramienta para datos fijos, y lugares
donde se trata el código como literales en línea. "as const"
también funciona con los arreglos:
myUnchangingUser.name = "Raîssa";
const exampleUsers = [{ name: "Brian" }, { name: "Fahrooq" }] as const;