Inferir varias cosas a la vez con tipos mapeados inversos

Rate this content
Bookmark

Aprende sobre la inferencia con tipos mapeados inversos para crear grandes inferencias para argumentos que agregan diferentes elementos de la misma forma. La técnica puede ayudarte a introducir relaciones a nivel de tipo dentro de objetos y tuplas. La masterclass comenzará con la introducción a la técnica y repasará un par de ejemplos similares al mundo real de cómo esto se puede utilizar para mejorar los tipos de biblioteca.

This talk has been presented at TypeScript Congress 2023, check out the latest edition of this JavaScript Conference.

FAQ

Mateusz Kruzynski trabaja en Stately, enfocándose en máquinas de estado y temas relacionados. Además, mantiene varios proyectos de código abierto populares como Emotion, Redux Saga, ChangeSets, XState y contribuye ocasionalmente a TypeScript.

Los tipos de mapa en TypeScript son una función a nivel de tipo que acepta una unión de claves y produce un tipo de objeto. Son útiles para transformar los valores de las propiedades de los objetos y desde TypeScript 4.1 también permiten transformar las claves de las propiedades.

La función 'promiseify' en TypeScript itera sobre la clave de un tipo 't' y envuelve la clave actual de 't' con una función que devuelve una promesa de ese tipo, transformando así el objeto en un tipo de objeto RPC.

Los tipos de mapa inverso en TypeScript permiten determinar la entrada necesaria para una transformación específica en un tipo de salida. Son útiles para realizar inferencias sobre la entrada a partir de la transformación conocida y el resultado final.

En TypeScript, se puede utilizar una función a nivel de tipo que itera sobre las claves de un tipo 't', generando una función que recibe 'k' como su parámetro de nombre. Esto permite vincular dinámicamente los nombres de los parámetros a las claves correspondientes de un objeto, facilitando la inferencia de tipos.

Un ejemplo práctico de tipos de mapa inverso es su uso en la gestión de eventos, donde se puede vincular tipos de eventos específicos a los oyentes correspondientes, asegurando que cada oyente maneje solo el tipo de evento que le corresponde, mejorando la precisión y la experiencia del desarrollador.

Mateusz Burzyński
Mateusz Burzyński
26 min
21 Sep, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Mateusz Kruzynski presenta los tipos mapeados inversos y demuestra su uso en la transformación de tipos de objeto. Discute cómo los tipos mapeados inversos se pueden utilizar para la inferencia y para proporcionar tipos contextuales para los tipos de parámetros. También muestra cómo los tipos mapeados inversos se pueden utilizar para extender una entidad y vincular oyentes de eventos. En el contexto de las máquinas de estado, explica cómo los tipos mapeados inversos se pueden utilizar para tipificar fuertemente la propiedad inicial y crear máquinas de estado jerárquicas. Sin embargo, hay limitaciones a tener en cuenta, como inferir una sola cosa por propiedad de objeto o elemento de tupla.

1. Introducción a los Tipos de Mapa Inverso

Short description:

Mi nombre es Mateusz Kruzynski. Trabajo en Stately y mantengo proyectos de código abierto populares como Emotion, Redux Saga, ChangeSets, XState, y contribuyo a TypeScript. Hoy, hablaré sobre la inferencia de varias cosas a la vez con tipos de mapa inverso. Los tipos de mapa son funciones a nivel de tipo que transforman los tipos de objeto. Pueden transformar los valores de las propiedades y las claves de las propiedades. Veamos un ejemplo con la transformación del tipo de objeto utilizando la función de identidad.

Mi nombre es Mateusz Kruzynski. Trabajo en Stately, donde trabajamos en máquinas de estado y todas las cosas relacionadas con eso. También mantengo un par de proyectos de código abierto populares, como Emotion, Redux Saga, ChangeSets, XState, obviamente, y también contribuyo a TypeScript de vez en cuando. Y me gustaría contarles hoy más sobre la inferencia de varias cosas a la vez con tipos de mapa inverso. Entonces, comencemos con un breve resumen de lo que realmente son los tipos de mapa. Entonces, son algo así como una función a nivel de tipo y aceptan una unión de claves, producen un tipo de objeto, y son muy útiles para la transformación del tipo de objeto. Se utilizan comúnmente para transformar los valores de las propiedades del objeto, pero desde TypeScript 4.1 también es posible transformar las claves de las propiedades del objeto. Entonces, en cierto sentido, solo tenemos nuestra x, nuestra entrada n, y la transformamos en nuestra y con cualquier transformación que la sintaxis de TypeScript nos permita. Entonces, veamos un breve ejemplo. Definimos que nuestra entrada es un tipo de objeto con dos propiedades, foo y bar, y ambas tienen tipos diferentes. Entonces, también definimos nuestro tipo de función. Este es solo identidad. Y podemos ver cómo se ve la sintaxis para ello. Ponemos en corchetes nuestra k. Eso es como nuestra i en un bucle for. Entonces, podemos usar eso para buscar esa propiedad en nuestro parámetro de tipo t y usar ese valor de alguna manera. Aquí, simplemente tomamos lo mismo y lo devolvemos. Ahora, podemos intentar llamarlo a nivel de tipo, y el punto es que deberíamos ser, deberíamos obtener realmente la misma cosa solo

2. Tipos de Mapa Inverso e Inferencia

Short description:

Echemos un vistazo a algo más útil en la práctica. Definimos una función a nivel de tipo llamada promiseify, que envuelve una clave de t con una función que devuelve una promesa de ese tipo. Los tipos de mapa inverso se ocupan de la transformación de X a Y, donde conocemos la transformación y la salida Y, e intentamos averiguar la entrada X. Esto es útil para la inferencia. Podemos definir objetos y proporcionar tipos contextuales para los tipos de parámetros utilizando funciones a nivel de tipo.

de vuelta. Entonces, podemos inspeccionar eso, y sí, este es exactamente el mismo tipo. Tal vez echemos un vistazo a algo un poco más útil en la práctica. Podemos definir otra función a nivel de tipo. Esta se llama promiseify, y hacemos algo muy similar. Iteramos sobre la clave de t con nuestra k, y simplemente envolvemos la k actual de t con una función que devuelve una promesa de ese tipo. Así que reutilizamos nuestro tipo de objeto anterior y lo tratamos como una especie de objeto RPC aquí. Ahora podemos intentar usarlo en runtime, podemos encadenar el método bar de él, y luego podemos ver que realmente podemos usarlo, por lo que es una promesa, y en el callback recibimos nuestro valor. Y al inspeccionar, podemos ver que esta propiedad bar es efectivamente una función que devuelve una promesa de número y val se resuelve con éxito a un tipo de número.

Entonces, ¿qué son los tipos de mapa inverso y cómo se relacionan con lo que acabamos de discutir? Así que con los tipos de mapa inverso, la situación es solo un poco diferente porque todavía tratamos con una transformación de X a Y. Pero esta vez está un poco invertido porque lo que sabemos es la transformación en sí y el resultado final, nuestra salida Y. Y lo que estamos tratando de averiguar es lo que obtuvimos como entrada para satisfacer esta transformación en Y. Así que intentamos averiguar cuál es nuestra entrada, cuál es nuestra X aquí. ¿Y para qué sirve esto realmente? Es útil para la inferencia. Kensi.s preguntó en Twitter cómo se puede hacer este tipo de cosas y esto inspiró esta charla. Así que echemos un vistazo a este ejemplo. Así que la pregunta aquí es cómo puede intentar definir un objeto y proporcionarle algún tipo contextual para los tipos de parámetros y esas diferentes claves para resolver a esas mismas claves. Entonces, en el método A, ¿cómo podemos resolver el nombre del parámetro a A y cómo podemos hacer lo mismo para B y cómo podemos resolver el nombre allí para ser. Así que esto realmente no se puede hacer con satisfies porque satisfies no participa en la inferencia y realmente no podemos crear un candidato para ello aquí pero podemos hacerlo con funciones así que veamos cómo podemos hacerlo aquí. Así que primero definamos una función a nivel de tipo satisfy name para parecerse a lo que teníamos en la diapositiva anterior y esta es esta misma operación iteramos sobre la clave de T con K y simplemente producimos una función que recibe K como su parámetro de nombre y puede devolver libremente cualquier cosa porque su tipo de retorno está tipado como void. Ahora, para utilizarlo realmente, necesitamos introducir una función, la llamamos satisfy object name y reutilizamos esa función a nivel de tipo que acabamos de declarar anteriormente. Y la parte complicada es que ahora aquí ese objeto literal que pasamos a la función satisfy object name es una especie de nuestra salida y necesitamos que el motor de inferencia de TypeScript tenga que revertir lo que podría ser la entrada para esto. Así que podemos ver que realmente puede hacer eso, como podemos resolver el rompecabezas de Kant y podemos resolver esas claves aquí para esos tipos de parámetros y podemos buscarlo en la función satisfyObjectName que efectivamente infirió con éxito algún objeto de entrada que si lo proporcionamos entre los corchetes angulares utilizados como un explícito parámetro de tipo podríamos pasar de este objeto a esta salida que hemos visto como un argumento pasado a la función satisfyObjectName. Continuemos con un ejemplo más avanzado de la función provideValue y de nuevo declaramos una función a nivel de tipo aquí y esta vez ponemos k de t en la propiedad val de toda esta plantilla de este tipo mapeado y también introducimos una nueva propiedad que es un cb que significa callback y usamos esa misma k de t aquí como en una función por lo que deberíamos ser capaces de resolver a lo que se ha utilizado como la propiedad val. Deberíamos ser capaces de usar eso como el tipo de parámetro para esta función y ahora podemos ver que efectivamente es capaz de averiguar que debería usar ese tipo específico de propiedad de valor para a y b las claves de nivel superior de este objeto de entrada y podemos ver que aquí fue capaz de comprimir todo este objeto en una forma más sencilla para responder de nuevo a la pregunta de qué podría ser la entrada para satisfacer toda esta operación de mapeo y para que esta salida sea producida aquí he resaltado aquí esos lugares aquí que fueron utilizados para crear este objeto de entrada y si echamos un vistazo a nuestra plantilla en el tipo mapeado veríamos que esos lugares se relacionan exactamente con nuestra plantilla y que TypeScript fue capaz de ingeniería inversa de alguna manera ese tipo de entrada. Continuemos con otro ejemplo. Esta vez declaramos algo, digamos, una entidad database, usuario que tiene tres propiedades, nombre, apellido y edad. De nuevo, definimos nuestra plantilla para nuestro tipo de mapa y aquí especificamos algunos requisitos para toda la transformación y la propiedad needs. Noten que esto puede ser cualquier cosa aquí, realmente no nos importa lo que será, lo usaremos de una manera específica pero en este punto está sin vincular y en realidad podría resolver a cualquier cosa. Pero lo que pongamos en esta propiedad needs será utilizado en la propiedad compute y esta vez elegimos del usuario objeto, clave de esta k de t que se resuelve a nuestra propiedad needs en este lugar muy específico y lo intersectamos con la clave del usuario. Este es un truco ingenioso para filtrar esas propiedades porque lo que pongamos en la propiedad needs deberían ser propiedades del usuario objeto de usuario. Así que al intersectar esos requisitos en la posición needs con las claves reales del usuario creamos un conjunto común de esas dos cosas por lo que es como filtrar en el mapa en el

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Los tipos más útiles de React
React Day Berlin 2023React Day Berlin 2023
21 min
Los tipos más útiles de React
Top Content
Today's Talk focuses on React's best types and JSX. It covers the types of JSX and React components, including React.fc and React.reactnode. The discussion also explores JSX intrinsic elements and react.component props, highlighting their differences and use cases. The Talk concludes with insights on using React.componentType and passing components, as well as utilizing the react.element ref type for external libraries like React-Select.
TypeScript y React: Secretos de un matrimonio feliz
React Advanced 2022React Advanced 2022
21 min
TypeScript y React: Secretos de un matrimonio feliz
Top Content
React and TypeScript have a strong relationship, with TypeScript offering benefits like better type checking and contract enforcement. Failing early and failing hard is important in software development to catch errors and debug effectively. TypeScript provides early detection of errors and ensures data accuracy in components and hooks. It offers superior type safety but can become complex as the codebase grows. Using union types in props can resolve errors and address dependencies. Dynamic communication and type contracts can be achieved through generics. Understanding React's built-in types and hooks like useState and useRef is crucial for leveraging their functionality.
Haciendo Magia: Construyendo un Marco de Trabajo Primero-TypeScript
TypeScript Congress 2023TypeScript Congress 2023
31 min
Haciendo Magia: Construyendo un Marco de Trabajo Primero-TypeScript
Top Content
Daniel Rowe discusses building a TypeScript-first framework at TypeScript Congress and shares his involvement in various projects. Nuxt is a progressive framework built on Vue.js, aiming to reduce friction and distraction for developers. It leverages TypeScript for inference and aims to be the source of truth for projects. Nuxt provides type safety and extensibility through integration with TypeScript. Migrating to TypeScript offers long-term maintenance benefits and can uncover hidden bugs. Nuxt focuses on improving existing tools and finds inspiration in frameworks like TRPC.
Deja de Escribir tus Rutas
Vue.js London 2023Vue.js London 2023
30 min
Deja de Escribir tus Rutas
Designing APIs is a challenge, and it's important to consider the language used and different versions of the API. API ergonomics focus on ease of use and trade-offs. Routing is a misunderstood aspect of API design, and file-based routing can simplify it. Unplugging View Router provides typed routes and eliminates the need to pass routes when creating the router. Data loading and handling can be improved with data loaders and predictable routes. Handling protected routes and index and ID files are also discussed.
Compilaciones de TypeScript más rápidas con --isolatedDeclarations
TypeScript Congress 2023TypeScript Congress 2023
24 min
Compilaciones de TypeScript más rápidas con --isolatedDeclarations
Top Content
This talk discusses the performance issues in TypeScript builds and introduces a new feature called isolated declarations. By running the compiler in parallel and using isolated modules, significant performance gains can be achieved. Isolated declarations improve build speed, compatibility with other tools, and require developers to write types in code. This feature has the potential to further increase performance and may be available in TypeScript soon.

Workshops on related topic

React, TypeScript y TDD
React Advanced 2021React Advanced 2021
174 min
React, TypeScript y TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.

¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.

¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.
Dominando conceptos avanzados en TypeScript
React Summit US 2023React Summit US 2023
132 min
Dominando conceptos avanzados en TypeScript
Top Content
Featured WorkshopFree
Jiri Lojda
Jiri Lojda
TypeScript no es solo tipos e interfaces. Únete a esta masterclass para dominar características más avanzadas de TypeScript que harán tu código a prueba de balas. Cubriremos tipos condicionales y notación de inferencia, cadenas de plantillas y cómo mapear sobre tipos de unión y propiedades de objetos/arrays. Cada tema se demostrará en una aplicación de muestra que se escribió con tipos básicos o sin tipos en absoluto y juntos mejoraremos el código para que te familiarices más con cada característica y puedas llevar este nuevo conocimiento directamente a tus proyectos.
Aprenderás:- - ¿Qué son los tipos condicionales y la notación de inferencia?- ¿Qué son las cadenas de plantillas?- Cómo mapear sobre tipos de unión y propiedades de objetos/arrays.
Consejos y Trucos Profundos de TypeScript
Node Congress 2024Node Congress 2024
83 min
Consejos y Trucos Profundos de TypeScript
Top Content
Featured Workshop
Josh Goldberg
Josh Goldberg
TypeScript tiene un sistema de tipos poderoso con todo tipo de características sofisticadas para representar estados de JavaScript salvajes y extravagantes. Pero la sintaxis para hacerlo no siempre es sencilla, y los mensajes de error no siempre son precisos al decirte qué está mal. Vamos a profundizar en cómo funcionan muchas de las características más poderosas de TypeScript, qué tipos de problemas del mundo real resuelven, y cómo dominar el sistema de tipos para que puedas escribir código TypeScript verdaderamente excelente.
Domina los Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Domina los Patrones de JavaScript
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante esta masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debería conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final de la masterclass, los participantes ganarán una nueva confianza en su capacidad para escribir código JavaScript de alta calidad que resista el paso del tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y la comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento de la carrera y las oportunidades de avance en la industria del software
Mejores Prácticas y Consejos Avanzados de TypeScript para Desarrolladores de React
React Advanced 2022React Advanced 2022
148 min
Mejores Prácticas y Consejos Avanzados de TypeScript para Desarrolladores de React
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
¿Eres un desarrollador de React tratando de obtener los máximos beneficios de TypeScript? Entonces esta es la masterclass para ti.En esta masterclass interactiva, comenzaremos desde lo básico y examinaremos los pros y contras de las diferentes formas en que puedes declarar componentes de React usando TypeScript. Después de eso, pasaremos a conceptos más avanzados donde iremos más allá de la configuración estricta de TypeScript. Aprenderás cuándo usar tipos como any, unknown y never. Exploraremos el uso de predicados de tipo, guardias y comprobación exhaustiva. Aprenderás sobre los tipos mapeados incorporados, así como cómo crear tus propias utilidades de mapa de tipo nuevo. Y comenzaremos a programar en el sistema de tipos de TypeScript usando tipos condicionales e inferencia de tipos.