如何使用类转换器将typescript类转换为普通javascript对象
我的angular应用程序中有一些typescript类实例,必须保存到firebase。Firebase不支持自定义类,所以我发现:这似乎非常适合我 现在我正在创建我的对象,并尝试转换它 这是我的目标如何使用类转换器将typescript类转换为普通javascript对象,javascript,typescript,class-transformer,Javascript,Typescript,Class Transformer,我的angular应用程序中有一些typescript类实例,必须保存到firebase。Firebase不支持自定义类,所以我发现:这似乎非常适合我 现在我正在创建我的对象,并尝试转换它 这是我的目标 export class Trip { id: string; owner: string; name: string; @Type(() => Date) startDate: Date; @Type(() => Date) endDate: Date
export class Trip {
id: string;
owner: string;
name: string;
@Type(() => Date)
startDate: Date;
@Type(() => Date)
endDate: Date | undefined;
coverImageUrl: string;
@Type(() => Itinerary)
itinerary: Itinerary;
constructor() {
this.itinerary = new Itinerary();
}
}
export class Itinerary {
@Type(() => ItineraryStats)
stats: ItineraryStats;
@Type(() => Step, {
discriminator: {
property: '__type',
subTypes: [
{ value: ActivityStep, name: 'ActivityStep' },
{ value: NightStep, name: 'NightStep' },
{ value: PointOfInterest, name: 'PointOfInterest' },
{ value: TravelStep, name: 'TravelStep' },
],
},
})
steps: Step[];
constructor() {
this.steps = Step[0];
this.stats = new ItineraryStats();
}
}
export class ItineraryStats {
///In days
duration: number;
//in hours
driveTime: number;
//in kilometers
driveDistance: number;
averageDriveDistancePerDay(): number {
return this.driveDistance / this.duration;
}
averageDriveTimePerDay(): number {
return this.driveTime / this.duration;
}
}
export abstract class Step {
@Type(() => Date)
start: Date;
@Type(() => Date)
end: Date;
duration: number;
enforcedStartStop: boolean;
warning: string;
}
export class ActivityStep extends StopStep {
duration: number;
constructor() {
super();
this.id = Guid.newGuid();
}
}
export class NightStep extends StopStep {
nightNumber: number;
numberOfNight: number;
}
export class PointOfInterest {
@Type(()=>PointOfInterest)
type: PointOfInterest;
}
export class TravelStep extends Step {
@Type(() => TravelMode)
Mode: TravelMode;
PolyLines: string;
}
我正在创建一个“旅行”,并尝试将其转换为:
const trip = new Trip();
trip.owner= firebase.auth().currentUser.uid;
trip.name= action.name;
trip.startDate = action.startDate,
trip.endDate = action.endDate;
console.log(trip);
const converted = classToPlain(trip)
但我明白了:
ERROR TypeError: Cannot read property 'constructor' of undefined
at TransformOperationExecutor.js:207
at Array.find (<anonymous>)
at TransformOperationExecutor.transform (TransformOperationExecutor.js:207)
at TransformOperationExecutor.transform (TransformOperationExecutor.js:266)
at ClassTransformer.classToPlain (ClassTransformer.js:10)
at classToPlain (index.js:8)
at Object.toFirestore (trips.firestore.ts:16)
at ma (index.cjs.js:15983)
at n.set (index.cjs.js:15359)
at AngularFirestoreDocument.set (angular-fire-firestore.js:512)
错误类型错误:无法读取未定义的属性“构造函数”
在TransformOperationExecutor.js:207
在Array.find(
我猜要么我的对象处于不正确的状态,要么我的定义不正确,但我找不到什么?错误在于行程的定义,更具体地说是代码行this.steps=Step[0];
将变量设置为未定义且很可能不是故意的。类转换器
库可以处理属性步骤
为空数组、步骤数组或起初不存在,但当值设置为未定义时崩溃
export class Itinerary {
@Type(() => ItineraryStats)
stats: ItineraryStats;
@Type(() => Step, {
discriminator: {
property: '__type',
subTypes: [
{ value: ActivityStep, name: 'ActivityStep' },
{ value: NightStep, name: 'NightStep' },
{ value: PointOfInterest, name: 'PointOfInterest' },
{ value: TravelStep, name: 'TravelStep' },
],
},
})
steps: Step[];
constructor() {
// Step[0] causes the crash, because its undefined, either dont set it or
// set it to this.steps = []
this.steps = Step[0];
this.stats = new ItineraryStats();
}
}
更多详细信息:
由于在属性步骤
上使用了鉴别器,相应的逻辑启动并比较了在子类型
下定义的构造函数与当前值的构造函数,以找到正确的子类型名称:
if (this.transformationType === TransformationType.CLASS_TO_PLAIN) {
subValue[targetType.options.discriminator.property] = targetType.options.discriminator.subTypes.find(
subType => subType.value === subValue.constructor
).name;
}
步骤[0]
未定义最终导致此行子值。构造函数
崩溃。请共享类型
decorator@captain-yossarian这个decorator来自我链接的库:你应该创建一个感谢,我修复了这个,现在它似乎可以工作了。对不起,我是javascript的初学者(我仍然不知道为什么执行this.steps=Step[0]
会导致一个未定义的数组,而不是像java/c#^^这样的空数组。无论如何,你的建议(this.steps=[]
)有效,我仍然对日期有其他问题(为什么日期在其他语言中如此简单的时候,却很难在javascript中处理)