【发布时间】:2020-07-20 12:01:00
【问题描述】:
我将一个对象从 Java 传递到具有“地图”属性的 Typescript。我的打字稿模型是由接口而不是类来描述的:
export interface Foo {
bar: Map<string, Bar>;
mapOfBar: Map<string, Map<string, Bar>>;
}
export interface Bar {
someField: string;
}
我编写了查询 JSON 对象并将其转换为 Foo 的代码:
import {HttpClient} from '@angular/common/http';
...
export class FooService {
constructor(private http: HttpClient) {
}
getFoo(): Observable<Foo> {
return this.http.get<Foo>('/some/route/to/FooEndpoint');
}
}
这将返回对象,但 bar 和 mapOfBar 是对象类型,而不是 Map。所以在网上搜索了很多之后,我想出了这个代码:
getFoo(): Observable<Foo> {
return this.http
.get<Foo>('/some/route/to/FooEndpoint')
.pipe(
map((res: Foo) => {
res.bar = new Map(Object.entries(res.bar));
let actualMapOfBar = new Map(Object.entries(res.mapOfBar));
res.mapOfBar = new Map();
for (let [key, bar] of actualMapOfBar) {
res.mapOfBar.set(key, new Map(Object.entries(bar)));
}
return res;
})
);
}
这会将bar 和mapOfBar 作为地图返回给我,这很棒。
称我为完美主义者,但不知何故这让人觉得笨拙和错误:
-
map((res: Foo) => {行表明res已经实现了Foo接口,但它没有——它只包含属性,但不包含正确的类型(还)。 - 这需要设置相当多的转换逻辑,尤其是在处理深度嵌套的对象树时。
有没有更简单的方法来实现这一点,或者可以优化吗?理想情况下,是否有一些“自动”的方式使用 Typescript 接口来转换对象?
(Angular 9.1,Typescript 3.8,rxjs 6.5)
编辑: 这是端点返回的示例响应:
{"bar":{"key1":{"someField":"A"},"key2":{"someField":"B"},"key3":{"someField":"C"}},"mapOfBar":{"A":{"key1":{"someField":"A"},"key2":{"someField":"B"},"key3":{"someField":"C"}},"B":{"key1":{"someField":"A"},"key2":{"someField":"B"},"key3":{"someField":"C"}},"C":{"key1":{"someField":"A"},"key2":{"someField":"B"},"key3":{"someField":"C"}}}}
【问题讨论】:
标签: json angular typescript rxjs