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
- 01
interface I { m(): string } class K implements I { m(): string { return 'ok' } }
Coincide con la base.
- 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.