Closed
Description
TypeScript Version: TS Playground version (3.4.1), 3.5.0-dev.20190523
Search Terms: ReturnType, function, conditional type
Code
declare function doThing<
F extends () => any
>(
f: () => ReturnType<F>
): void;
//== This fails ==
type Bar<F extends () => any> = (
& (() => ReturnType<F>)
//Should be the same as `unknown`
& (F extends any ? unknown : unknown)
);
function bar<F extends () => any>(f: F) {
/*
Fail
Type 'ReturnType<F>' is not assignable to type
'ReturnType<(() => ReturnType<F>) & (F extends any ? unknown : unknown)>'
Type '() => any' is not assignable to type
'F extends any ? unknown : unknown'
*/
doThing<Bar<F>>(() : ReturnType<F> => {
return f();
});
//Fail
//Type '() => any' is not assignable to type 'F extends any ? unknown : unknown'
const t: (
F extends any ? unknown : unknown
) = ((): any => 3);
//OK!
const t2: (
unknown
) = ((): any => 3);
}
//== This works ==
type Bar2<F extends () => any> = (
& (() => ReturnType<F>)
& unknown
);
function bar2<F extends () => any>(f: F) {
//OK!
doThing<Bar2<F>>(() : ReturnType<F> => {
return f();
});
}
Expected behavior:
All failures should work.
Actual behavior:
They do not work.
Playground Link: Playground
Related Issues:
- Generics; ReturnType<Foo> != ReturnType<typeof foo> #24277 is sort of similar?
Metadata
Metadata
Assignees
Labels
No labels