在TypeScript中填充数组并在函数之间传递
我有一个对象模型,其中一个值是一个数组。我正在尝试填充它,但在VS Code环境中遇到了错误:
Type 'Promise
' 缺少来自类型 'GenericViewModel' 的以下属性:rating、reportingDate、comments,以及另外4个。ts(2740)
我已经搜索过,仍然不能确定如何正确填充该属性。我在网上看到的一切都说这是正确的做法。我正在使用Visual Studio Code,并在构建一个Angular应用。
我的函数和模型如下:
async getRawData(){
let pList: PViewModel[] = [];
let criteria = {storedProcedure: 'sp_Get_Data_For_ESM'};
await super.post('universal-sp-pass-thru/spPassThroughnoBody',criteria,'api-eprs');
pList = this.apiPostResponse.data;
const scorecardData: ScorecardModel = {pcorecardModel: []};
// Process each
pList.forEach((p) => {
const pData: PScorecardModel = {
pId: p.pId,
OpenViewModel: [],
};
pData.OpenViewModel[] = this.getGenericData(p.pId, p.reportingDate,p.OpenViewModel_ST,p.OpenViewModel_TABLE)
scorecardData.pScorecardModel.push(pData);
});
}
async getGenericData(pId:string,reportingDate:Date | null, ised:string, tablename:string): Promise<GenericViewModel[]> {
let GenericViewModel: GenericViewModel[] = [];
let body = {
pId: pId,
reportingDate:reportingDate,
ised: ised,
tablename: tablename,
};
let criteria = {
storedProcedure: 'sp_GetScorecard',
body: body,
};
await super.post('sword-universal-sp-pass-thru/spPassThrough',criteria,'api-eprs');
GenericViewModel = this.apiPostResponse.data;
return GenericViewModel;
}
/** Generic view‑model used in many collections */
export interface GenericViewModel {
rating: string;
reportingDate: Date | null;
comments: string;
results: string;
rtg_date: string;
phase: string;
denominator: number;
}
export interface ProgramScorecardModel {
pId: string;
OpenViewModel: GenericViewModel[];
}
我在这行上得到错误:
pData.OpenViewModel[] = this.getGenericData(p.pId, p.reportingDate,p.OpenViewModel_ST,p.OpenViewModel_TABLE)
我已经按照注释中的指示添加了 await。错误变为:
Type 'GenericViewModel[]' 缺少来自类型 'GenericViewModel' 的以下属性:
我尝试将GetGenericData的输出结果修改为以下内容:
data = this.apiPostResponse.data;
const GenericViewModel: GenericViewModel[] = data.map(p => ({
rating: p.rating,
comments: p.comments,
reportingDate: p.reportingDate,
results: p.results,
rtg_date:p.rtg_date,
phase:p.phase,
denominator:p.denominator,
}));
return GenericViewModel;
The await super.post 返回一个Promise。
如何正确填充 pData.OpenViewModel[]?
解决方案
在 getRawData 中的这行需要对 getGenericData 的调用使用await:
// Populate the specific view model list (example for ENG_STAFFING_3_LA)
// Replace `new Date()` with the actual reporting date if it is available.
pData.OpenViewModel[] = await this.getGenericData(p.pId, p.reportingDate,p.OpenViewModel_ST,p.OpenViewModel_TABLE)
^^^^^
在大量代码中很容易忽略这种情况。错误信息中引用的类型是关键线索:Promise<GenericViewModel[]> —— 在这个异常中任何提到 Promise<T> 的地方都会让我去找我忘记对的函数调用 await。 Async functions 返回一个 Promise 对象。
针对你对问题的更新,getRawData 函数应改成这样:
async getRawData(){
let pList: PViewModel[] = [];
let criteria = {storedProcedure: 'sp_Get_Data_For_ESM'};
await super.post('universal-sp-pass-thru/spPassThroughnoBody',criteria,'api-eprs');
let pList = this.apiPostResponse.data;
const scorecardData: ScorecardModel = {pcorecardModel: []};
// Process each
pList.forEach(async (p) => {
const pData: PScorecardModel = {
pId: p.pId,
OpenViewModel: [],
};
pData.OpenViewModel[] = await this.getGenericData(p.pId, p.reportingDate,p.OpenViewModel_ST,p.OpenViewModel_TABLE)
scorecardData.pScorecardModel.push(pData);
});
}
主要变化如下:
- 你正在使用
forEach函数对pList进行循环;这需要一个lambda表达式,同时循环体也需要标记为async,因为循环体需要对一个函数调用进行await。 - 你需要
await调用getGenericData。 - 给
pList赋值时使用let关键字:
let pList = this.apiPostResponse.data;
省略该关键字会创建一个隐式声明的全局变量,或者一个模块级变量,取决于你的TypeScript文件是如何导入的。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。