Y la razón es que en realidad podemos pasar objetos que tienen más claves que las de una persona. ¿Qué sucede si pasamos el objeto P1, que tiene una propiedad de nombre y una propiedad de edad? Bueno, el bucle for tomará la primera clave, que es nombre, la convertirá en mayúscula y todo funcionará bien, pero luego tendrá la clave de edad y cuando indexe con la clave de edad obtendrá un número, que no tiene el método toUpperCase, y esto fallará en tiempo de ejecución. Entonces, si object.keys devolviera una matriz de las claves que pasamos como tipo, podríamos obtener en tiempo de ejecución más claves de las que esperábamos, y esto podría provocar errores en tiempo de ejecución. Y esta es la razón por la que object.keys tiene el tipo que tiene, porque si no lo tuviera, si devolviera una matriz de clave de lo que pasamos, podríamos obtener errores en tiempo de ejecución que no esperábamos y errores en tiempo de ejecución en un programa que verifica completamente los tipos.
Pasemos ahora a las uniones de objetos. ¿Qué significan? Bueno, tomemos un ejemplo. Digamos que tenemos dos tipos de objetos y queremos tomar su unión. Bueno, esto significa que nuestro nuevo conjunto, nuestra unión, tendrá valores de objeto que pueden tener una propiedad de nombre o una propiedad de ID, pero no sabemos exactamente cuál. Por lo tanto, no es seguro acceder a ninguna de estas propiedades porque es posible que no estén presentes. Una de ellas lo estará, pero no sabemos cuál. Si estos tipos tuvieran alguna propiedad en común, por ejemplo, descripción, entonces esa propiedad sería segura de acceder porque podemos decir con certeza que debe estar presente en todos los valores de objeto dentro de este conjunto. Y esto nuevamente es una fuente de confusión para muchos principiantes en TypeScript porque la operación de unión se nombra en función de lo que hace en el conjunto de valores, no necesariamente en función de lo que hace en los miembros porque las uniones permitirán el acceso a una intersección de miembros. Pero nuevamente, la operación se nombra en función de lo que hace en los conjuntos de valores descritos por estos tipos.
¿Qué hay de las intersecciones de tipos de objetos? Bueno, sufren una confusión similar. Es decir, si tomamos la intersección de estos dos conjuntos, lo que tendremos en la intersección son valores de objeto que tienen tanto el nombre como el ID. Y dado que tienen ambas propiedades, es seguro acceder a cualquiera de ellas. Entonces, la intersección de tipos de objetos intersectará los conjuntos definidos por los tipos y dará como resultado un nuevo tipo que tiene una unión de miembros. Pero nuevamente, la operación se nombra en función de lo que hace en los conjuntos, no en función de lo que hace en los miembros. Entonces, nuevamente, las uniones e intersecciones, muchas personas tienen la sensación al principio de que estos nombres son incorrectos porque, bueno, en las uniones tenemos una intersección de miembros, mientras que en las intersecciones tenemos una unión de miembros. Pero nuevamente, no se nombran en función de lo que hacen en los miembros, se nombran en función de lo que hacen en los conjuntos de valores.
Veamos si podemos usar el mismo truco que usamos en las uniones de tipos primitivos para filtrar una unión discriminada. Y aquí tenemos una unión discriminada que tiene dos componentes, uno de tipo cuadrado y otro de tipo círculo. ¿Cómo podemos extraer solo el componente de círculo? Y, por supuesto, podríamos usar un tipo condicional, que es definitivamente la forma preferida de hacer esto, pero las intersecciones también pueden hacer el trabajo. Y en su mayoría dan los mismos resultados. Entonces, ¿qué tipo podríamos intersectar con esta unión para preservar solo el tipo que tiene el tipo círculo? Y la respuesta es que podemos intersectar con otro tipo de objeto que tiene una propiedad de tipo círculo. Y esto realmente preservará solo el componente en el que estamos interesados porque la intersección no contiene ninguno de los objetos que podrían tener el tipo cuadrado. Entonces veamos cómo podría funcionar esto. Bueno, TypeScript intentará hacer lo mismo que hace para la unión de tipos primitivos, es decir, intentará llevarlo a la forma canónica. Entonces, en primer lugar, TypeScript expandirá esa forma en la unión que realmente es.
Comments