Реализация обобщенного c класса на основе другого обобщенного c класса в Angular 7 - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть следующие интерфейсы и классы в TypeScript:

export interface PageInterface<T> {
    count: number;
    previous: string;
    next: string;
    results: T[];
}

export class Page<T> implements PageInterface<T> {}

----------------------------------------------------------

export interface AdapterInterface<T> {
    adapt(item: any): T;
}

И мне нужно реализовать PageAdapter<Page<T>>.

Возможно ли это? Я пробовал следующее, но в итоге с ошибками ( Type 'Page' si not generi c):

export class PageAdapter<Page> implements AdapterInterface<Page> {
    adapt(item: any): Page<T> {
        return new Page<T>(item['count'], item['previous'], item['next'], item['results']);
    }
}

Если я поставлю Page<T> вместо Page в первой строке он вообще не работает.

Как мне это реализовать?

Большое спасибо,

1 Ответ

1 голос
/ 04 февраля 2020

Я предполагаю, что вы ищете что-то вроде этого:

export class PageAdapter<T> implements AdapterInterface<Page<T>> {
    adapt(item: any): Page<T> {
        return new Page<T>(item['count'], item['previous'], item['next'], item['results']);
    }
}

Так, например, PageAdapter<string> можно использовать как AdapterInterface<Page<string>>. Если вам действительно нужно, чтобы параметр типа generi c имел тип Page, вы можете написать что-то вроде этого:

export class PageAdapter2<P extends Page<any>> implements AdapterInterface<P> {
    adapt(item: any): P {
        return new Page(item['count'], item['previous'], item['next'], item['results']) as P;
    }
}

Здесь PageAdapter<Page<string>> можно использовать как AdapterInterface<Page<string>>. Однако типизация для этой версии не так чиста, и для ее реализации требуется утверждение типа .

Надеюсь, это поможет; удачи!

Детская площадка ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...