Búsqueda de sitios web

typescript - ¿Puede un decorador de propiedad definir el tipo de la propiedad del decorador?


Tengo un decorador de propiedad que devuelve un descriptor de propiedad. ¿Hay alguna manera de decirle al compilador el tipo de la propiedad decorada x a través del decorador?

p. ej.

// returns a readonly string property descriptor
function d(target, key) {
    return {
        get: function() : string {return 'hello'}
    }
}

// would like type of property x to be `string` either inferred
// or taken from decorator getter signature
class A {
    @d()
    x 
}

El problema que estoy tratando de resolver es eliminar el trabajo extra para el usuario del decorador: mis decoradores definen la propiedad (incluido el tipo), por lo que repetir el tipo (x: string en este caso) es redundante. El ejemplo del mundo real son las clases de base de datos donde todas las propiedades (cientos) están decoradas. Actualmente, cada propiedad tiene el decorador Y una anotación de tipo específica. El punto de dolor surgió cuando habilité --strictNullChecks, lo que significa que cientos de propiedades necesitarían que se agregara | null al tipo (porque la base de datos permite establecer null como valor). Dado que el decorador dicta el tipo de propiedad, espero poder omitir la declaración del tipo.

Veo que TS incluye una declaración genérica TypedPropertyDescriptor, pero los decoradores de propiedades tienen que devolver void o any, de lo contrario el compilador da error.

Respuesta #1

Desafortunadamente, no creo que lo que estás intentando sea actualmente posible en la versión actual de Typescript. Estás intentando modificar la firma de la clase A estableciendo implícitamente el tipo de la propiedad x mediante el decorador; no hay forma de que el compilador sepa qué tipo debería tener x ni forma de que el compilador sepa que x debería tener el método get.

Hay un gran hilo en GitHub sobre un problema muy similar con los decoradores de clases. https://github.com/Microsoft/TypeScript/issues/4881 ¡Quizás sigue ese hilo si estás interesado!

Podrías abordar esto de manera diferente y suministrar un genérico con restricciones a la clase A; sin embargo, no estoy seguro de qué problema estás tratando de resolver, por lo que eso podría no ser una opción.