为什么在使用Angular CRUD操作时,我们需要在get/post方法中提到返回类型


getCompanyInformation(id: number): Observable<BaseModel<CompanyInfoModel[]>> {
return this.http.get<BaseModel<CompanyInfoModel[]>>(apiUrl + 'getcompanybyid/' + companyId)
.pipe(
tap(_ => console.log(`fetched company id=${companyId}`)),
catchError(this.handleError<BaseModel<CompanyInfoModel[]>>(`getCompany id=${companyId}`))
)
}

从上面的例子中,我试图理解,如果我们已经提到我们的返回类型为:Observable<BaseModel<CompanyInfoModel[]>>,那么为什么我们需要在get方法.get<BaseModel<CompanyInfoModel[]>>之后再次提到,如果我在.get((之后删除了这个<BaseModel<CompanyInfoModel[]>>,我会得到一个错误,称为类型'Observable<Object>' is not assignable to type 'Obserable<BaseModel<CompanyInfoModel[]>>'

基本模型.ts

export class BaseEntityModel<T> {
public entity: T[];
public status: number;
public message: string;
constructor(init?: Partial<BaseEntityModel<T>>) {
Object.assign(this, init);
}
}

公司模型.ts

export class CompanyInformation {
companyID: number;
companyName: string;
description: string
constructor(init?: Partial<CompanyInformation>) {
Object.assign(this, init);
}
}

这就是typescript的工作原理。默认情况下,http.get(不带参数(返回一个Observable<Object>。因此,如果您将方法的返回类型声明为Observable<BaseModel<CompanyInfoModel[]>>,Typescript将抱怨您从方法中声明为返回类型的内容与http.get调用将返回的内容不匹配。

然而,类型推断应该以另一种方式工作:如果使用http.get<BaseModel<CompanyInfoModel[]>>,那么通常不需要为方法指定返回类型

getCompanyInformation(id: number) {
return this.http.get<BaseModel<CompanyInfoModel[]>>(apiUrl + 'getcompanybyid/' + companyId)
.pipe(
tap(_ => console.log(`fetched company id=${companyId}`)),
catchError(this.handleError<BaseModel<CompanyInfoModel[]>>(`getCompany id=${companyId}`))
)
}

(就我个人而言,为了可读性,我仍然喜欢指定返回类型(

最新更新