javascript - 为什么在 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 中的行为
非常感谢您的帮助和时间。
解决方案
显然,传入的stayToPrepare
参数不是 typeSejourItem
而是{ sejourItem: SejourItem }
.
最好的方法当然是在调用之前修复这个问题prepareBody
。也许是这样的:
this.prepareBody(stayToPrepare.sejourItem, query, stayBefore)
请确认我是否正确假设。
推荐阅读
- visual-studio - 使用本机事件的 C++ 内部编译器错误
- r - 使用依赖于条件语句的不同函数创建多个新列
- linux - 当套接字和服务的名称不同时,Systemd 套接字服务失败并出现错误
- firebase - 如何从 Firestore Flutter 中删除子集合
- c# - 在字典中查找蒙古语
- c# - 在 OWIN 中记录 JWT Bearer 身份验证和验证
- r - data.table 中的函数,具有两列作为参数
- android - System.exit() 之后是否有任何 android 服务回调函数被调用?
- python - Django 按类别查看帖子
- maven - gradle依赖失败但它在那里