(Typescript) Параметр Generi c неправильно компилируется для условного типа при использовании логического значения - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть следующий тип - когда определено P, функция должна принимать параметр типа P и возвращаемое значение типа P. В противном случае он не должен принимать никаких параметров и возвращать void. По некоторым причинам это не работает для логического значения и:

  1. Я не понимаю, почему.
  2. Есть ли способ заставить его работать для логического значения без явного добавления дополнительного условия, когда P extends boolean (как это работает).
export type Test<P = void> = P extends void
    ? () => void
    : (payload: P) => P

const test0: Test = () => {} // compiles

const test1: Test<number> = (payload: number): number => payload // compiles

const test2: Test<boolean> = (payload: boolean): boolean => payload // doesn't compile

1 Ответ

1 голос
/ 05 апреля 2020

Первый почему :

boolean распространяется как объединение true | false, поэтому результирующий тип равен
((payload: false) => false) | ((payload: true) => true)'.

Подробнее здесь


Как заставить это работать:

Только «голые типы» являются кандидатами на распространение. Один из возможных способов отказаться:

type Test<P = void> = [P] extends [void] 
    ? () => void 
    : (payload: P) => P

Детская площадка

...