Как реализовать интерфейс PromiseLike? - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь реализовать процесс автоматической фиксации с возможностью поддержки. Но я не могу обойти ошибку типа, на которую жаловались в прошлом случае:

type JobResolve = () => void

export class Job implements PromiseLike<JobResolve> {
  public then<TResult1 = JobResolve>(onfulfilled?: ((value: JobResolve) => (PromiseLike<TResult1> | TResult1)) | undefined | null): PromiseLike<TResult1> {
    const done = () => {}
    if (typeof onfulfilled === 'function') {
      const thenable = Promise.resolve(onfulfilled(done))
      done()
      return thenable
    } else {
      // Error here!
      // TS2322: '() => void' is assignable to the constraint of type 'TResult1', but 'TResult1' could be instantiated with a different subtype of constraint '{}'.
      return Promise.resolve(done)
    }
  }
}

Как ее решить? (без Promise.resolve(done as any))

1 Ответ

0 голосов
/ 21 апреля 2020

Ваша ветка else показывает слабость в определении на PromiseLike. Рассмотрим этот пример .

async function f() {
    let t: {a: string} = await Promise.resolve(1).then<{a: string}>();
    console.log(t, t.a, typeof t, typeof t.a);
}
f();

t имеет тип number не object, но система типов считает, что это объект.

Если ваш цель состоит в том, чтобы обеспечить соответствие Promise, вы можете просто привести возвращаемое значение к типу возвращаемого значения, как в:

    return Promise.resolve(done) as PromiseLike<TResult1>

, или, чтобы быть более безопасным, вызвать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...