Type Widening and Narrowing
Podría ser más fácil comenzar el debate sobre la ampliación y
la reducción con un ejemplo:
// Aparte de las diferencias de texto en las cadenas, welcomeString
es una const (lo que significa que el valor nunca cambiará)
y replyString es un let (lo que significa que puede cambiar).
Si pasas el cursor por encima de ambas variables, obtienes
información de tipo muy diferente de TypeScript:
const welcomeString: "Hello There"
let replyString: string
TypeScript ha inferido el tipo de welcomeString como la cadena
literal "Hello There", mientras que replyString es una cadena
general.
Esto se debe a que let necesita un tipo mas amplio, podrias
establecer replyString como cualquier otra cadena, lo que
significa que tiene un conjunto más amplio de posibilidades.
const welcomeString = "Hello There";
let replyString = "Hey";
// Si replyString tiene como tipo la cadena literal "Hey" -
entonces nunca podrías cambiar el valor porque sólo podría
cambiar a "Hey" de nuevo.
La ampliación y reducción de tipos se basa en aumentar o
reducir las posibilidades que un tipo puede representar.
Un ejemplo de reducción de tipo es trabajar con uniones, el
ejemplo del análisis de flujo de código se basa casi
enteramente en la reducción: example:code-flow
La reducción de tipo es lo que impulsa el modo estricto de
TypeScript a través de las verificaciones de nulidad. Con el
modo estricto desactivado, los marcadores de nulidad como
indefinido y nulo son ignorados en una unión.
replyString = "Hi :wave:";
// En el modo estricto la responsabilidad es del autor del código
para asegurar que el tipo se ha reducido al tipo no nulo.
Normalmente esto es tan simple como una comprobación de tipo if:
declare const quantumString: string | undefined;
// Esto fallará sólo en modo estricto
quantumString.length;
// En el modo estricto, el tipo quantumString tiene dos representaciones.
Dentro del condicional if, el tipo fue reducido a solo una cadena.
Puede ver más ejemplos de reducción en:
example:union-and-intersection-types
example:discriminate-types
Y aún más recursos en la web:
https://mariusschulz.com/blog/literal-type-widening-in-typescript
https://sandersn.github.io/manual/Widening-and-Narrowing-in-Typescript.html
if (quantumString) {
quantumString.length;
}