Почему получаются разные результаты conditional type, когда приходят одинаковые union types. При этом эти union types были получены разным способом

Я написал два своих Await-а для промиса, но один почему-то не работает. И выводит тип never

type MyAwaitF<T> = T extends null | undefined
  ? never
  : T extends object & { then(...args: infer Arg): any }
  ? Arg[0] extends (value: infer V) => unknown
    ? V
    : never
  : never;

type MyAwaitS<T> = T extends null | undefined
  ? never
  : T extends object & { then(f: infer F): any }
  ? F extends (value: infer V) => unknown
    ? V
    : never
  : never;

type ResF = MyAwaitF<Promise<string>>; // never 
type ResS = MyAwaitS<Promise<string>>; // string

Я пробовал получить типы Arg[0] и F.

В первом случае Arg[0] имеет union type ((value: string) => unknown) | null | undefined

Во втором случае F имеет ((value: string) => unknown) | null | undefined

Но третий conditional в MyAwaitF возвращает разные результаты. В чем может быть проблема?


Ответы (0 шт):