我有相当深的感情
interface
export interface Job {
JobId: JobId;
UserId: UserId;
JobName: string;
AudioFile: JobAudioFile;
Status: JobStatus;
Tracks: JobTracks[];
Results: JobResults;
Timestamps: JobTimestamps
}
这个接口的大多数成员本身就是接口,通用体系结构遵循使用枚举、字符串、数组和更多接口的模式。所有代码都以TypeScript的形式编写,传输到JS,并以JS的形式上传到AWS。(节点8.10在AWS上运行)
在代码中的某一点上,我需要对
Job
export const StartPipeline: Handler = async (
event: PipelineEvent
): Promise<PipelineEvent> => {
console.log('StartPipeline Event: %o', event);
const newBucket = await copyToJobsBucket$(event.Job);
await deleteFromOriginalBucket$(event.Job);
console.log(`Job [${event.Job.JobId}] moved to Jobs bucket: ${newBucket}`);
event.Job.AudioFile.Bucket = newBucket;
event.Job.Status = Types.JobStatus.Processing;
const msg: Types.JobUpdatedMessage = new Types.JobUpdatedMessage({ Job: Object.assign({}, event.Job) });
await Send.to$(event.Job.UserId, msg);
return { ...event };
};
定义
JobUpdatedMessage
export class JobUpdatedMessage extends BaseMessage {
constructor(payload: { Job: Types.Job }) {
console.log('Incoming: %o', payload);
const copy: object = { ...payload.Job };
const filtered = JobUtils.FilterJobProperties(copy as Types.Job);
super(MessageTypes.JobUpdated, filtered);
}
}
问题是在打电话给
JobUtils.FilterJobProperties
payload.Job
也以一种不受欢迎和意想不到的方式发生了变异。
JobUtils.FilterJobProperties
:
export const FilterJobProperties = (from: Types.Job): Types.Job => {
const fieldsToRemove: string[] = [
'Transcripts.GSTT',
'Transcripts.WSTT',
'Transcripts.ASTT',
'TranscriptTracks',
'Transcripts.Stream.File',
'Transcripts.Stream.State',
'AudioFile.Bucket',
'AudioFile.S3Key',
];
let job: Types.Job = { ...from };
fieldsToRemove.forEach(field => _.unset(job, field));
return job;
};
(我正在使用洛达斯图书馆)
from
函数参数,即使在“第一行”中,我正在做我认为是
从…起
我知道这是因为如果我将“第一行”更改为:
let job: Types.Job = JSON.parse(JSON.stringify(from));
从…起
作业更新消息
如预期的那样,以及
StartPipeline
event
参数没有从中删除一组属性
event.Job
我为此挣扎了数小时,包括重新学习我认为我知道的关于使用扩展操作符在Es6中克隆对象的所有知识。
为什么“第一行”也会改变输入?