Búsqueda de sitios web

typescript2.0 - ¿Sobrescribir método abstracto en TypeScript?


Tengo un método abstracto:

abstract setProp<T, K extends keyof T>(value: keyof T, key: K);

Intenté sobrescribir esto en la clase heredera:

public setProp<IParentProfile, K extends keyof IParentProfile>(value: keyof IParentProfile, key: K) {
    this.model[key] = value;
  }

Pero la interpretación me dice un error:

Método de anulación incompatible de la clase abstracta, ¿dónde cometí un error?

También probé de esta manera:

abstract setProp<T, K extends keyof T>(model: T, value: keyof T, key: K): T;

Y usando:

public setProp<IParentProfile, K extends keyof IParentProfile>(model: IParentProfile, value: keyof IParentProfile, key: K) {
    return model[key] = value;
  }

¿Puedes ver por qué esto no funciona, por favor?

Respuesta #1

Como dije en los comentarios, parece un error del compilador. (Esto solo aborda la incapacidad de sobrescribir tu método genérico, no el código que agregaste en el enlace después.)

Lo siguiente es actualmente un error en TypeScript 2.9 y versiones anteriores:

class A {
  m<T, U extends T>(t: T, u: U) { }
}

class B extends A {
  m<T, U extends T>(t: T, u: U) { }
//^--error, T is not assignable to T
}

Parece que no se puede sobrescribir un método genérico si sus restricciones genéricas usan parámetros de tipo.

Presenté Microsoft/TypeScript#25373 y ha sido (a partir del 2018-07-02) clasificado como un error, el cual está previsto que se aborde en TypeScript 3.1.

Hasta entonces, supongo que necesitas usar soluciones alternativas. De hecho, la única solución alternativa que puedo encontrar que te permite anular métodos genéricos abstract usando restricciones de parámetros de tipo es el martillo de soluciones alternativas, el comentario @tsignore:

class A {
  m<T, U extends T>(t: T, u: U) { }
}

class B extends A {
  // @ts-ignore
  m<T, U extends T>(t: T, u: U) { } // no error
}

Normalmente no recomiendo usar @ts-ignore, porque lo único que hace es suprimir la salida de errores; no soluciona nada mágicamente. Pero suponiendo que el error del compilador se arregle en un futuro cercano, es una solución temporal razonable.

¡Espero que eso ayude; buena suerte!

Artículos relacionados