Проблема заключается в том, что машинопись не отслеживает отношения между kind
и changeFn
, создаваемые перегрузками.Таким образом, changeFn
все еще может быть неопределенным в отношении ts, даже если вы находитесь на ветви kind === 'update'
.
Самое простое решение - использовать ненулевое утверждение:
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;
}
}