在TypeScript中填充数组并在函数之间传递

前端开发 2026-07-09

我有一个对象模型,其中一个值是一个数组。我正在尝试填充它,但在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> 的地方都会让我去找我忘记对的函数调用 awaitAsync 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章