为什么属性在他的父对象之外添加?

Why is the property added outside his parent in 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;
    }

所以当我想实现一个post请求时,它定义了prods:rowState到'created',returns一个干净的Sejour对象,我post 到我的后端。

这是我的问题:

当我 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。而且我更不明白为什么它在 stackblitz 中能正常工作。

有人知道发生了什么吗?如果是,我很高兴知道我在这里遗漏了什么。

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

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

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

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

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

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

请确认我的假设是否正确