问题是打字稿不跟踪之间的关系kind
and changeFn
这是由重载创建的。所以changeFn
就 ts 而言,即使您位于kind === 'update'
branch.
最简单的解决方案是使用非空断言:
this.changeRequestsQueue.push({
id,
kind: 'update',
resolve,
reject,
changeFn: changeFn!,
});
如果您想要完整的非断言版本,可以在参数中使用可区分的元组来完成,尽管我不确定它是否值得额外的复杂性:
export class QueueService<TEntity extends IBaseEntity> {
private changeRequestsQueue: Array<IChangeRequestPromiseProxy<TEntity>> = [];
private flushingQueueMutex: boolean = false;
public async enqueue(id: Id, kind: 'delete'): Promise<void>;
public async enqueue(
id: Id,
kind: 'update',
changeFn: (entity: IPersistence<TEntity>) => IPersistence<TEntity>,
): Promise<IPersistence<TEntity>>;
public async enqueue(
id: Id,
...r: ['delete'] | ['update', (entity: IPersistence<TEntity>) => IPersistence<TEntity>],
): Promise<IPersistence<TEntity> | void> {
let promise: Promise<IPersistence<TEntity> | void>;
switch (r[0]) {
case 'delete':
promise = new Promise<void>(async (resolve, reject) => {
this.changeRequestsQueue.push({
id,
kind: r[0],
resolve,
reject,
});
});
break;
case 'update':
default:
promise = new Promise<IPersistence<TEntity>>(async (resolve, reject) => {
this.changeRequestsQueue.push({
id,
kind: r[0],
resolve,
reject,
changeFn: r[1],
});
});
break;
}
return promise;
}
}