Используя Angular 7 у меня было это:
export class Envelope<T> {
result: T[];
constructor(result: T[]) {
this.result = result;
}
}
Я сопоставил Observable<Envelope<Todo>>
, возврат через todoService, к Observable<TodoModel[]>
:
let models: Observable<TodoModel[]> = this.todoService.get()
.pipe(
map((envelope: Envelope<Todo>) =>
envelope.result.map((todo: Todo) => {
return {
content: todo.content
// Other properties
};
})));
Это работает, но теперь конверт изменен на (result: T
, а не result: T[]
):
export class Envelope<T> {
result: T;
constructor(result: T) {
this.result = result;
}
}
Мне нужно сопоставить Observable<Envelope<Todo[]>>
с тем же Observable<TodoModel[]>
:
let models: Observable<TodoModel[]> = this.todoService.get()
.pipe(
map((envelope: Envelope<Todo[]>) =>
envelope.result.map((todo: Todo) => {
return {
content: todo.content
// Other properties
};
})));
Я пробовал несколько вариантов, но получаю следующую ошибку:
Argument of type 'OperatorFunction<Envelope<Todo[]>, { content: string; }[]>'
is not assignable to parameter of type 'OperatorFunction<Envelope<Todo>, { content: string; }[]>'.
Type 'Envelope<Todo[]>' is not assignable to type 'Envelope<Todo>'.
Type 'Todo[]' is missing the following properties from type 'Response': content.
Может кто-нибудь, пожалуйста, дайте мне знать, как сделать отображение?
Обновление
API возвращает, например, что-то следующее:
{
"result": [
{ "id": 1, "title": "T1", content: "C1" },
{ "id": 2, "title": "T2", content: "C2" }
]
}
Затем TodoService возвращает его как Observable<Envelope<Todo[]>>
, где Todo
равно:
interface Todo {
id: number;
title: string;
content: string;
}
В компоненте мне нужно сопоставить Observable<Envelope<Todo[]>>
с Observable<TodoModel[]>
, где TodoModel
:
interface TodoModel {
title: string;
content: string;
}
У меня в приложении есть более сложные сценарии, но основа такова.