如何使用类转换器将typescript类转换为普通javascript对象

如何使用类转换器将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

我的angular应用程序中有一些typescript类实例,必须保存到firebase。Firebase不支持自定义类,所以我发现:这似乎非常适合我

现在我正在创建我的对象,并尝试转换它

这是我的目标

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中处理)