Почему получаются разные результаты 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 возвращает разные результаты. В чем может быть проблема?