Búsqueda de sitios web

Clase abstracta genérica de TypeScript: ¿Por qué este método abstracto no hereda el tipo de la clase?


Vengo de un trasfondo en C# y actualmente estoy intentando entender Typescript. Me he encontrado con el siguiente problema al crear una clase abstracta genérica en Typescript, y no estoy seguro si es un problema con mi implementación o una limitación del lenguaje:

Dada la siguiente clase abstracta, y una clase que la extiende:

abstract class Filter<T> {
    value T;
    abstract apply<T>(items: T[]): T[];
}

class StringFilter extends Filter<string> {
    apply(items: string[]) {
        return items.filter(i => this.value === i);
    }
}

Recibo el siguiente error:

Property 'apply' in type 'StringFilter' is not assignable to the same property in base type 'Filter<string>'.
Type '(items: string[]) => string[]' is not assignable to type '<T>(items: T[]) => T[]'.

En C# habría esperado que el método apply compartiera el mismo tipo genérico que la clase, pero en TypeScript esto no parece ser el caso.

¿Cómo puedo asegurarme de que un tipo de Filter<string> tenga un método apply de tipo (items: string[]) => string[]?

Respuesta #1

No necesitas proporcionar el parámetro genérico a apply. La siguiente modificación de tu código se compila sin problemas.

abstract class Filter<T> {
    value: T;
    abstract apply(items: T[]): T[];
}

class StringFilter extends Filter<string> {
    apply(items: string[]) {
        return items.filter(i => this.value === i);
    }
}

Respuesta #2

Necesitas eliminar el <T> del método abstracto apply.

¿Cómo puedo asegurarme de que un tipo de Filtro tenga un método apply de tipo (items: string[]) => string[]?

Bueno, ya estás haciendo eso. La definición del método abstracto "apply" ya está asegurando tu solicitud. Al establecer la clase abstracta como genérica, todos los métodos/propiedades definidos heredarán la especificación T en la clase concreta.

Artículos relacionados