/
voidReturnIndexUnionInference.types
61 lines (50 loc) · 1.69 KB
/
voidReturnIndexUnionInference.types
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
=== tests/cases/compiler/voidReturnIndexUnionInference.ts ===
// repro from https://github.com/Microsoft/TypeScript/issues/25274
export function safeInvoke<A1, R>(
>safeInvoke : <A1, R>(func: ((arg1: A1) => R) | null | undefined, arg1: A1) => R | undefined
func: ((arg1: A1) => R) | null | undefined,
>func : ((arg1: A1) => R) | null | undefined
>arg1 : A1
>null : null
arg1: A1
>arg1 : A1
): R | undefined {
if (func) {
>func : ((arg1: A1) => R) | null | undefined
return func(arg1);
>func(arg1) : R
>func : (arg1: A1) => R
>arg1 : A1
} else {
return undefined;
>undefined : undefined
}
}
interface Props {
onFoo?(value: string): boolean;
>onFoo : ((value: string) => boolean) | undefined
>value : string
onBar?(value: string): void;
>onBar : ((value: string) => void) | undefined
>value : string
}
function bad<P extends Props>(props: Readonly<P>) {
>bad : <P extends Props>(props: Readonly<P>) => void
>props : Readonly<P>
safeInvoke(props.onFoo, "blah");
>safeInvoke(props.onFoo, "blah") : boolean | undefined
>safeInvoke : <A1, R>(func: ((arg1: A1) => R) | null | undefined, arg1: A1) => R | undefined
>props.onFoo : P["onFoo"] | undefined
>props : Readonly<P>
>onFoo : P["onFoo"] | undefined
>"blah" : "blah"
// ERROR HERE!!!
// Type R in signature of safeInvoke incorrectly inferred as {} instead of void!
safeInvoke(props.onBar, "blah");
>safeInvoke(props.onBar, "blah") : void | undefined
>safeInvoke : <A1, R>(func: ((arg1: A1) => R) | null | undefined, arg1: A1) => R | undefined
>props.onBar : P["onBar"] | undefined
>props : Readonly<P>
>onBar : P["onBar"] | undefined
>"blah" : "blah"
}