首页 > 解决方案 > 为什么在 Object 中将属性添加到他的父级之外?

问题描述

我有一个这样声明的接口:

Sejour.ts

import { SejourItem } from './SejourItem';
export interface Sejour {
    dsAdvSejour: DsAdvSejour;
}

interface DsAdvSejour {
    'prods:hasChanges': any;
    ttSejour: SejourItem[];
    'prods:before': any;
}

其中包含一个 SejourItem 数组:

SejourItem.ts

export interface SejourItem {
    'prods:rowState'?: string;
    ROWID: string;
    Sequence: number;
    NoSejour: string;
    NomPatient: string;
    NoPatient: string;
    DateNaissance: Date | string;
    SexePatient: string;
    CodePostal: string;
    OrgAssur1: string;
    Statut: string;
    DateDebutSejour: Date | string;
    DateFinSejour: Date | string;
    CodeReadmission: string;
    Adresse: string;
    MotifAdmissionAdm: string;
    CodeAdresseParAdm: string;
    TypeSortieAdm: string;
    CodeDestinationAdm: string;
    TypePatient: string;
    TypeAdmission: string | null;
    TypeSejour: number;
    CodePays: string;
    HeureDebutSejour: string;
    HeureFinSejour: string;
    MinuteDebutSejour: string;
    MinuteFinSejour: string;
    SejourCloture: boolean;
    NumerosPrestataires: string;
    CodeNationalite: string;
    NoSejourMaman: string;
    SiteAdmission: string;
    LieuAvantAdmission: string;
    NbJoursReadmission: string;
    CodeAssociation: string;
    TypeAssociation: string;
    CodeAssurabiliteRHM: string;
    PatientVIP: string;
}

如您所见,我有一个可选属性,名为prods:rowState.

可以创建更新删除此值。

我有一个简单的功能,处理这些情况:

private prepareBody(stayToPrepare: SejourItem, query: string, stayBefore?: SejourItem): Sejour {
        query = query.toUpperCase();
        let preparedStay: Sejour = {} as Sejour;
        switch (query) {
            case 'POST':
                stayToPrepare['prods:rowState'] = 'created';
                preparedStay = {
                    dsAdvSejour: {
                        'prods:hasChanges': true,
                        ttSejour: [stayToPrepare],
                        'prods:before': {},
                    },
                };
                break;
            //Other cases...
        }
        return preparedStay;
    }

所以当我想实现一个发布请求时,它定义了prods:rowState“创建”,并返回一个干净的 Sejour 对象,我将它发布到我的后端。

这是我的问题:

当我刚刚console.log(JSON.stringify(preparedState, null, 2)),这就是我得到的:

{
  "dsAdvSejour": {
    "prods:hasChanges": true,
    "ttSejour": [
      {
        "sejourItem": { // Why do I have a key ? I was added in an array...
          "ROWID": "",
          "Sequence": 0,
          "NoSejour": "",
          "NomPatient": "",
          "NoPatient": "",
          "DateNaissance": "2021-03-30",
          "SexePatient": "",
          "CodePostal": "",
          "OrgAssur1": "",
          "Statut": "",
          "DateDebutSejour": "2021-03-30",
          "DateFinSejour": "2021-03-30",
          "CodeReadmission": "",
          "Adresse": "",
          "MotifAdmissionAdm": "",
          "CodeAdresseParAdm": "",
          "TypeSortieAdm": "",
          "CodeDestinationAdm": "",
          "TypePatient": "",
          "TypeAdmission": "",
          "TypeSejour": 0,
          "CodePays": "",
          "HeureDebutSejour": "0",
          "HeureFinSejour": "0",
          "MinuteDebutSejour": "0",
          "MinuteFinSejour": "0",
          "SejourCloture": false,
          "NumerosPrestataires": "",
          "CodeNationalite": "",
          "NoSejourMaman": "",
          "SiteAdmission": "",
          "LieuAvantAdmission": "",
          "NbJoursReadmission": "",
          "CodeAssociation": "",
          "TypeAssociation": "",
          "CodeAssurabiliteRHM": "",
          "PatientVIP": ""
        },
        "prods:rowState": "created" // Why am I added here ? I'm a SejourItem property...
      }
    ],
    "prods:before": {}
  }
}

只要我完全不明白为什么会发生这种情况,我就用类似的指令做了一个堆栈闪电战。而且我更不明白为什么它在stackblitz中正常工作。

有谁明白会发生什么?如果是的话,我很高兴知道我在这里缺少什么。

PS:我的代码最初在 Angular 11 项目中运行,如果这有帮助的话。

编辑:我的第一个想法是 TypeScript 错误,只要我不能使用相同的代码重现 StackBlitz 中的行为

非常感谢您的帮助和时间。

标签: javascripttypescriptangular11

解决方案


显然,传入的stayToPrepare参数不是 typeSejourItem而是{ sejourItem: SejourItem }.

最好的方法当然是在调用之前修复这个问题prepareBody。也许是这样的:

this.prepareBody(stayToPrepare.sejourItem, query, stayBefore)

请确认我是否正确假设。


推荐阅读