Эффективно. В конце концов, вы просто анализируете JSON, и результатом анализа JSON являются просто простые объекты JavaScript, а не пользовательские классы. this.http.get<Foo[]>
- это всего лишь подсказка для компилятора, но универсальный параметр ничего не делает. Он не конвертирует один объект в другой и не дает им типы.
В качестве совета, вы никогда не должны использовать классы при типизировании результатов вызовов сервисов или получения объектов из localStorage
, sessionStorage
и подобных. Вместо этого вы должны использовать интерфейсы без методов.
Тем не менее, можно достичь того, чего вы хотите, если вам действительно нужно, чтобы ваши объекты были класса Foo
и имели метод doSomething
:
this.http.get<Foo[]>(...).do(items => items.forEach(item => Object.setPrototypeOf(item, Foo.prototype)));
Это даст каждому объекту правильный прототип. Однако это снижает производительность, так как изменение прототипа созданных объектов портит оптимизацию браузера, так что делайте это на свой страх и риск.
Другим вариантом будет дать Foo
конструктор:
class Foo {
constructor(item: Foo) {
Object.assign(this, item);
}
bar: string;
public doSomething() {}
}
Сейчас:
this.http.get<Foo[]>(...).pipe(map(items => items.map(item => new Foo(item)))).subscribe(...);