Tengo el siguiente código:
abstract class Foo<T extends { data: string }> { abstract doSomething(params: T): void; } class Baz extends Foo<{ id: string; data: string }> { doSomething(params) {} } Mi expectativa es que al implementar el método doSomething automáticamente los params como T , pero lo infiere como any . ¿Me equivoco?
Al extender, el compilador solo verifica si la clase derivada es asignable a la clase base, usted es libre de diseñar la clase derivada siempre que sea asignable a la clase base.
Imagina que no estás extendiendo, solo escribiendo una clase regular. doSomething(param) implica implícitamente doSomething(param:any) . Esta dosis de implicación no cambia incluso cuando se está extendiendo. Dado que (any) => void es asignable a ({ id: string; data: string }) => void , todo está bien. El compilador no hará trabajo extra.