You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript报错TS2339:ApiResponse类型无PRE属性的技术求助

问题:TypeScript访问ApiResponse子类属性时出现TS2339错误

返回的WebService JSON结构

{
  "PRE": [
    {
      "DEPO": 979534429484,
      "CLER": "RC3038",
      "INTITULE1": "PORTEFEUILLE RC3038",
      "PHONE": "0999999999999",
      "TOMANY": "FALSE",
      "PREPTF": [
        {
          "NUM": 146662,
          "CLER": "RC3038",
          "SVM": 94533166,
          "ISIN": "BE0945331669",
          "LABEL": "ARKIMEDES FONDS",
          "QUANTITE": 10.00,
          "DATE": "2012-04-18",
          "TYPE": "IN",
          "PERSONNE_CONTACT": "",
          "CONTREPARTIE": "DEXIA",
          "TEL": 0,
          "FAX": 0,
          "STATUT": 9,
          "STATUT_LIB": "Fait",
          "REF_ALPHA": "CO12240000048563",
          "REF_RBC": "",
          "TRADE_DATE": "2012-04-18",
          "VALUE_DATE": "2012-04-19",
          "TRAITEMENT_DATE": "2012-04-18",
          "ANNULATION_DATE": "0001-01-01",
          "RECEPTION_DATE": "2012-04-25",
          "REM1": "",
          "REM2": "",
          "COURS_MOYEN_ACHAT": 160.100000,
          "ACHAT_DATE": "0001-01-01",
          "PMBIS": "N",
          "TIS": 0.000000,
          "CHANGEMENT_BENEF_ECO": "O"
        }
      ]
    }
  ]
}

定义的TypeScript接口

export interface TransferResponse extends ApiResponse {
  PRE: PreTransfer[];
}

export interface PreTransfer {
  DEPO: number;
  CLER: string;
  INTITULE1: string;
  PHONE: string;
  TOMANY: string;
  PREPTF: {
    NUM: number;
    CLER: string;
    SVM: number;
    ISIN: string;
    LABEL: string;
    QUANTITE: number;
    DATE: string;
    TYPE: string;
    PERSONNE_CONTACT: string;
    CONTREPARTIE: string;
    TEL: number;
    FAX: number;
    STATUT: number;
    STATUT_LIB: string;
    REF_ALPHA: string;
    REF_RBC: string;
    TRADE_DATE: string;
    VALUE_DATE: string;
    TRAITEMENT_DATE: string;
    ANNULATION_DATE: string;
    RECEPTION_DATE: string;
    REM1: string;
    REM2: string;
    COURS_MOYEN_ACHAT: number;
    ACHAT_DATE: string;
    PMBIS: string;
    TIS: number;
    CHANGEMENT_BENEF_ECO: string;
  }[];
}

数据获取方法代码

customerTransfers: PreTransfer;

overviewTransfers(account: string): void {
  this.service.overviewTransfers(account).pipe(
    takeUntil(this.unsubscribe$)
  ).subscribe(res => {
    this.customerTransfers = res.PRE.map(val => {
      return {
        

      }
    });

  });
}

报错信息

error TS2339: Property 'PRE' does not exist on type 'ApiResponse'.

67     this.customerTransfers = res.PRE.map(val => {

解决方案

问题根因

TypeScript类型校验认为res是ApiResponse类型(未包含PRE属性),尽管你定义了TransferResponse继承ApiResponse,但服务方法的返回类型未正确指定为TransferResponse,导致类型不匹配。此外,customerTransfers的类型定义与实际返回的数组类型不符。

具体修复步骤

  1. 修正服务方法的返回类型
    确保服务中overviewTransfers方法明确返回Observable<TransferResponse>:

    import { Observable } from 'rxjs';
    import { TransferResponse } from './your-interface-path';
    
    // 服务中的方法
    overviewTransfers(account: string): Observable<TransferResponse> {
      return this.http.get<TransferResponse>(`your-api-url/${account}`);
    }
    
  2. 修正变量类型
    res.PRE.map返回的是PreTransfer[]数组,因此customerTransfers的类型应改为数组:

    customerTransfers: PreTransfer[] = [];
    
  3. 完善map转换逻辑
    当前map函数为空返回,需补充属性映射(若无需修改原数据,可直接赋值数组):

    // 直接赋值(无需转换时)
    this.customerTransfers = res.PRE;
    
    // 或需要转换属性时
    this.customerTransfers = res.PRE.map(val => ({
      DEPO: val.DEPO,
      CLER: val.CLER,
      INTITULE1: val.INTITULE1,
      PHONE: val.PHONE,
      TOMANY: val.TOMANY,
      PREPTF: val.PREPTF // 嵌套数组如需转换也可在此处理
    }));
    

内容的提问来源于stack exchange,提问作者amelabamelab440

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:00:03