Как удалить параметр, когда универсальный тип 'T' равен 'void'? - PullRequest
1 голос
/ 01 мая 2019

Я пытаюсь определить тип обратного вызова resolve в приведенном ниже коде.

Первая попытка: просто

export interface PromiseToHandle<T> {
  resolve: (result: T) => void  // <----- The question is about that line
  reject: (error: any) => void
  promise: Promise<T>
}

export function promiseToHandle<T = any>(): PromiseToHandle<T> {
  let resolve!: any;
  let reject!: (error: any) => void;
  const promise = new Promise<T>((resolveCb, rejectCb) => {
    resolve = resolveCb;
    reject = rejectCb;
  });
  return { promise, resolve, reject };
}

const pth1 = promiseToHandle<boolean>();
pth1.resolve(true); // OK

const pth2 = promiseToHandle<void>();
pth2.resolve(); // OK

Работает так, как мне нужно, однаконеверный тип:

const pth3 = promiseToHandle<void>();
const voidResolve: () => void = pth3.resolve // Error: Type '(result: void) => void' is not assignable to type '() => void'.

Вторая попытка: с условным типом

export interface PromiseToHandle<T> {
  resolve: T extends void ? () => void : (result: T) => void
  reject: (error: any) => void
  promise: Promise<T>
}

const pth4 = promiseToHandle<void>();
const voidResolve2: () => void = pth4.resolve // OK

Предыдущая проблема решена.Но теперь основной случай не работает:

const pth5 = promiseToHandle<boolean>();
pth5.resolve(true); // Error: Argument of type 'true' is not assignable to parameter of type 'false & true'.

Я не знаю почему, но когда используется условный тип, тогда объединение (boolean равно false | true) преобразуется в пересечение(false & true)!

1 Ответ

1 голос
/ 01 мая 2019

Ваше решение с условными типами хорошо, вам просто нужно отключить поведение распределения условных типов

export interface PromiseToHandle<T> {
  resolve: [T] extends [void] ? () => void : (result: T) => void
  reject: (error: any) => void
  promise: Promise<T>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...