Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS2416

    El miembro no coincide con la base

    Property 'm' in type 'K' is not assignable to the same property in base type 'I'.…

    Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.

    El miembro existe, por eso no es TS2420 — pero su tipo no es compatible con el que declaró la base.

    Reproducción

    interface I {
      m(): string
    }
    
    class K implements I {
      m(): number {
        return 1
      }
    }

    La compilación afirma que esto emite exactamente este código.

    Por qué lo dice el compilador

    Un subtipo puede prometer *más* que su base, nunca menos ni algo distinto. Devolver un tipo más estrecho que el declarado por la base está bien; devolver uno no relacionado rompe a todo llamante escrito contra la interfaz. El detalle anidado bajo este mensaje es donde está la información real — nombra los dos tipos del miembro y en qué dirección falló la asignación.

    Arreglos

    1. 01
      interface I {
        m(): string
      }
      
      class K implements I {
        m(): string {
          return 'ok'
        }
      }

      Coincide con la base.

    2. 02
      interface I {
        m(): string | number
      }
      
      class K implements I {
        m(): number {
          return 1
        }
      }

      O amplía la base para que el miembro más estrecho sea una especialización legal. Ahora `number` es asignable a lo que `I` prometió, y a los llamantes se les avisó de esperar cualquiera.

    Conclusión

    La sustituibilidad va en un solo sentido. Donde se espera la base, el subtipo debe encajar, y «encaja» lo deciden las mismas reglas de asignabilidad que todo lo demás.

    Errores