typescript 类型“Observable< ArrayBuffer>”不能赋值给类型“Observable〈Date[]>"

798qvoo8  于 2023-03-04  发布在  TypeScript
关注(0)|答案(3)|浏览(173)
consultar ( opcion: string, articulo: Articulo ): Observable<Date[]> {
    return this.http.get<Date[]>( this.rootUrl + "consultar?opcion=" + opcion, articulo );
  }

问题:类型“Observable”无法分配给类型“Observable〈Date[]〉”。类型“ArrayBuffer”缺少类型“Date[]”的以下属性:长度、弹出、推送、连续以及27种以上。

hfyxw5xn

hfyxw5xn1#

由于已接受的建议编辑队列现在已满-2022年6月25日-我决定写这个答案,其中包含更多的细节和例子来阐述和说明这个问题:

阐述问题

我有一个接口:

export interface Media {
  id?: number;
  name: string;
  medium: string;
  category: string | null;
  year: string | null;
  watchedOn: string | null;
  isFavorite: boolean | null;
}

和负责执行HTTP调用的服务层:

@Injectable({
  providedIn: 'root',
})
export class MediaService {
  private readonly baseUrl: string;

  constructor(private httpClient: HttpClient) {
    this.baseUrl = environment.baseUrl.concat('/medias');
  }

  get(filters: Partial<Media>): Observable<Media[]> {
    return this.httpClient
      .get<Media[]>(this.baseUrl, {
        params: { ...filters },
      })
      .pipe(
        map((media) => {
          // TODO: Do required normalization
          return media;
        }),
      );
  }
}

当我们在做类似这样的事情时,我们需要使用这个重载:

get(url: string, options: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };
    context?: HttpContext;
    observe?: 'body';
    params?: HttpParams | {
        [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;
    };
    reportProgress?: boolean;
    responseType: 'arraybuffer';
    withCredentials?: boolean;
}): Observable<ArrayBuffer>;

而我们没有。

溶液

问题来自于我们接口中的| null,我们需要保证我们不会将null值传递给http参数,JSON可以做到这一点,所以在服务层中,我将get方法修改如下:

get(filters: Partial<Media>): Observable<Media[]> {
  // All the magic happens in these two line:
  const illuminateNils = JSON.parse(JSON.stringify(filters));
  const params = new HttpParams({
    fromObject: illuminateNils,
  });

  return this.httpClient
    .get<Media[]>(this.baseUrl, {
      params,
    })
    .pipe(
      map((media) => {
        // TODO: Do required normalization
        return media;
      }),
    );
}

现在Typescript不再歇斯底里。多亏了挑剔的Typescript,我们的代码更安全,更容易理解。

gzjq41n4

gzjq41n42#

get中的第二个参数应该是options,但您可能正在向它传递数据。
Angular 文档获取方法
构造将正文解释为ArrayBuffer并在ArrayBuffer中返回响应的GET请求。

dwbf0jvd

dwbf0jvd3#

我自己在尝试在后续请求中使用响应头时遇到了这个问题。

return this.http.post(url, myObject, { observe: 'response' }).pipe(mergeMap((res: HttpResponse<any>) => {
  const url = res.headers.get('Location');
  return this.http.get<MyObject>(url!);
}));

对我来说,解决办法是在URL后面添加一个!。不确定为什么一个可空字符串会导致Typescript认为我的Observable正在返回一个ArrayBuffer。

相关问题