Angular 使用带有嵌套对象的模型时出现角度类型脚本错误
我在HttpClient上使用angular 6 这是我对OMDB api执行搜索调用时得到的结果:Angular 使用带有嵌套对象的模型时出现角度类型脚本错误,angular,typescript,Angular,Typescript,我在HttpClient上使用angular 6 这是我对OMDB api执行搜索调用时得到的结果: {"Search":[{"Title":"Pirates of the Caribbean: At World's End","Year":"2007","imdbID":"tt0449088","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMjIyNjkxNzEyMl5BMl5BanBnXkFtZTYwMjc3M
{"Search":[{"Title":"Pirates of the Caribbean: At World's End","Year":"2007","imdbID":"tt0449088","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMjIyNjkxNzEyMl5BMl5BanBnXkFtZTYwMjc3MDE3._V1_SX300.jpg"},{"Title":"This Is the End","Year":"2013","imdbID":"tt1245492","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMTQxODE3NjM1Ml5BMl5BanBnXkFtZTcwMzkzNjc4OA@@._V1_SX300.jpg"},{"Title":"The World's End","Year":"2013","imdbID":"tt1213663","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BNzA1MTk1MzY0OV5BMl5BanBnXkFtZTgwNjkzNTUwMDE@._V1_SX300.jpg"},{"Title":"Seeking a Friend for the End of the World","Year":"2012","imdbID":"tt1307068","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMTk4MDQ1NzE3N15BMl5BanBnXkFtZTcwMjA0MDkzNw@@._V1_SX300.jpg"},{"Title":"House at the End of the Street","Year":"2012","imdbID":"tt1582507","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMjIxNTUwNTU4N15BMl5BanBnXkFtZTcwNTE0MTI3Nw@@._V1_SX300.jpg"},{"Title":"The End of the F***ing World","Year":"2017–","imdbID":"tt6257970","Type":"series","Poster":"https://ia.media-imdb.com/images/M/MV5BMzhhMTczMDQtNWE0Yy00OTJiLTlmYjgtNWU1MmVkYTVlYWVhXkEyXkFqcGdeQXVyNjEwNTM2Mzc@._V1_SX300.jpg"},{"Title":"John Dies at the End","Year":"2012","imdbID":"tt1783732","Type":"movie","Poster":"https://images-na.ssl-images-amazon.com/images/M/MV5BMTUyNzIyNzc0MV5BMl5BanBnXkFtZTcwOTM5ODg1OA@@._V1_SX300.jpg"},{"Title":"The End of the Tour","Year":"2015","imdbID":"tt3416744","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BMTUwODU3NjQxNF5BMl5BanBnXkFtZTgwODE2NTE4NTE@._V1_SX300.jpg"},{"Title":"Neon Genesis Evangelion: The End of Evangelion","Year":"1997","imdbID":"tt0169858","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BYmE1ZTFjZTMtMDVjYy00ZWYwLTg2ZGUtODhhODgxMjdhYjAxXkEyXkFqcGdeQXVyMzM4MjM0Nzg@._V1_SX300.jpg"},{"Title":"The End of the Affair","Year":"1999","imdbID":"tt0172396","Type":"movie","Poster":"https://ia.media-imdb.com/images/M/MV5BYzhkNDRkMDctYTcxMy00MTI3LWI5ODQtZWNkYWQ2ZjA2ZDk2XkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"}],"totalResults":"1311","Response":"True"}
此结果由搜索(带结果的对象)、totalResults(字符串)和response(字符串)组成
“我的服务”文件中的搜索功能:
search(term: string): Observable<Result[]> {
const url = `http://www.omdbapi.com?s=${term}&apikey=12345`;
return this.http.get<Result[]>(url).pipe(
map(search => search.Search),
catchError(this.handleError)
);
}
我找不到一种方法来处理OMDB api给我的响应。模型如下所示:
export class Result {
totalResults: number;
Response: boolean;
Search: {
Poster: string;
Title: string;
Type: string;
Year: number;
imdbID: string;
};
}
属性
Search
是一个数组。编辑您的函数search(term:string)
到search(term:array)
http请求将返回一个结果[]
。错误是说没有结果[]。搜索,这是真的
你可以这样做
map((results: Result[]) => results.map((result:Result) => result.Search))
results.map
指的是而不是RxJs
您还需要提取Search
interface/class并返回Observable
只需添加map((Search:Result)=>Search.Search)
错误将得到解决。@DevangNaghera这将破坏使用的全部目的interfaces@bugs更新了代码:)@DevangNaghera您的第一个建议code
map((search:any)=>search.search)运行良好,但是我认为最好定义类型。您当前的解决方案出现了以下错误:“OperatorFunction”类型的参数看起来不错,但我得到了这样的结果:类型“Observable”不可分配给类型“Observable”。
您想返回不正确的ObservableThat。该参数用于用户使用键盘键入的输入。
map((results: Result[]) => results.map((result:Result) => result.Search))