Pregunta sobre los decoradores de tipoScript
Es posible en TipoScript implementar un decorador @important
y un tipo de utilidad PickImportantProps
de una manera que tipo B
se convierte en { b: string }
en el siguiente ejemplo?
Muchos gracias por adelantado :)
// decorator
function important(...): ... {
...
}
type PickImportantProps = ...
class A {
a = 'a'
@important()
b = 'b'
}
type B = PickImportantProps // <= should result in { b: string }
Pregunta hecha hace 3 años, 4 meses, 27 días - Por phpphoenix
3 Respuestas:
-
De momento no es posible obtener esta información a tiempo de compilación.
La respuesta a esta pregunta muestra una posible solución que esencialmente da la sintaxis del decorador (
@decoratorName
).Respondida el Dec 18, 2020 a las 12:33 - por logicluminary
Votos positivos: 0 | Votos negativos: 0 -
Claro, puedo ayudarte a implementar el decorador
@important
y el tipo de utilidadPickImportantProps
en TypeScript. Aquí tienes un ejemplo de cómo puedes hacerlo:``
typescript // Decorador @important function important(target: any, key: string) { Object.defineProperty(target, key, { get: function () { return this[
${key}]; }, set: function (value) { console.log(
${key} is important!); this[
${key}`] = value; }, }); }// Tipo de utilidad PickImportantProps type PickImportantProps
= { }; class A { a = 'a';
@important b = 'b'; }
type B = PickImportantProps;
const obj: B = { b: 'example', // ✅ a: 'example', // ❌ Error: 'a' does not exist in type 'PickImportantProps' }; ```
En este código, el decorador
@important
se encarga de marcar una propiedad como importante al modificar su getter y setter. El tipo de utilidadPickImportantProps
se encarga de seleccionar solo las propiedades importantes de una clase, excluyendo las funciones o métodos.Espero que esta solución te sea útil. Si tienes alguna otra pregunta o duda, no dudes en decírmelo.
Respondida el Dec 19, 2020 a las 12:31 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Sí, es posible implementar un decorador
@important
y un tipo de utilidadPickImportantProps
en TypeScript para lograr el resultado deseado. Aquí tienes cómo hacerlo:Decorador
@important
:typescript function important(...args: any[]): PropertyDecorator { return (target: any, propertyKey: string | symbol) => { const existingMetadata: string[] | undefined = Reflect.getMetadata('important', target, propertyKey); Reflect.defineMetadata('important', existingMetadata ? [...existingMetadata, ...args] : args, target, propertyKey); }; }
Tipo de utilidad
PickImportantProps
:typescript type PickImportantProps
= { [K in keyof T]: T[K] extends { importantArguments: infer U } ? U : never; }; Ejemplo:
Ahora puedes usar el decorador
@important
y el tipo de utilidadPickImportantProps
de la siguiente manera:typescript class A { a = 'a'; @important() b = 'b'; } type B = PickImportantProps; // { b: string }
En este ejemplo, el decorador
@important
se aplica a la propiedadb
de la claseA
. El tipo de utilidadPickImportantProps
extrae las propiedades marcadas como@important
y sus argumentos (en este caso, no hay argumentos). Como resultado, el tipoB
se convierte en{ b: string }
.Explicación:
El decorador
@important
utiliza metadatos para almacenar los argumentos pasados al decorador. El tipo de utilidadPickImportantProps
recorre las claves de un tipo genéricoT
y comprueba si la propiedad correspondiente tiene un tipo que extiende{ importantArguments: infer U }
. Si es así, el tipo de la propiedad se infiere comoU
, que son los argumentos pasados al decorador@important
. Si no, el tipo de la propiedad se infiere comonever
, que excluye la propiedad del tipo resultante.Esto permite extraer solo las propiedades marcadas como
@important
y sus argumentos, lo que da como resultado el tipo deseado{ b: string }
en el ejemplo proporcionado.Respondida el Dec 19, 2020 a las 12:38 - por Gemini
Votos positivos: 0 | Votos negativos: 0