File: coAndContraVariantInferences.types

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (104 lines) | stat: -rw-r--r-- 3,333 bytes parent folder | download | duplicates (3)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
=== tests/cases/compiler/coAndContraVariantInferences.ts ===
type A = { kind: 'a' };
>A : { kind: 'a'; }
>kind : "a"

type B = { kind: 'b' };
>B : { kind: 'b'; }
>kind : "b"

declare const a: A;
>a : A

declare const b: B;
>b : B

declare function fab(arg: A | B): void;
>fab : (arg: A | B) => void
>arg : A | B

declare function foo<T>(x: { kind: T }, f: (arg: { kind: T }) => void): void;
>foo : <T>(x: {    kind: T;}, f: (arg: {    kind: T;}) => void) => void
>x : { kind: T; }
>kind : T
>f : (arg: {    kind: T;}) => void
>arg : { kind: T; }
>kind : T

foo(a, fab);
>foo(a, fab) : void
>foo : <T>(x: { kind: T; }, f: (arg: { kind: T; }) => void) => void
>a : A
>fab : (arg: A | B) => void

foo(b, fab);
>foo(b, fab) : void
>foo : <T>(x: { kind: T; }, f: (arg: { kind: T; }) => void) => void
>b : B
>fab : (arg: A | B) => void

// Repro from #45603

interface Action<TName extends string,TPayload> {
    name: TName,
>name : TName

    payload: TPayload
>payload : TPayload
}

const actionA = { payload: 'any-string' } as Action<'ACTION_A', string>;
>actionA : Action<"ACTION_A", string>
>{ payload: 'any-string' } as Action<'ACTION_A', string> : Action<"ACTION_A", string>
>{ payload: 'any-string' } : { payload: string; }
>payload : string
>'any-string' : "any-string"

const actionB = { payload: true } as Action<'ACTION_B', boolean>;
>actionB : Action<"ACTION_B", boolean>
>{ payload: true } as Action<'ACTION_B', boolean> : Action<"ACTION_B", boolean>
>{ payload: true } : { payload: true; }
>payload : true
>true : true

function call<TName extends string,TPayload>(
>call : <TName extends string, TPayload>(action: Action<TName, TPayload>, fn: (action: Action<TName, TPayload>) => any) => void

  action: Action<TName,TPayload>,
>action : Action<TName, TPayload>

  fn: (action: Action<TName,TPayload>)=> any,
>fn : (action: Action<TName, TPayload>) => any
>action : Action<TName, TPayload>

) {
  fn(action);
>fn(action) : any
>fn : (action: Action<TName, TPayload>) => any
>action : Action<TName, TPayload>
}

const printFn = (action: typeof actionA | typeof actionB)=> console.log(action);
>printFn : (action: typeof actionA | typeof actionB) => void
>(action: typeof actionA | typeof actionB)=> console.log(action) : (action: typeof actionA | typeof actionB) => void
>action : Action<"ACTION_A", string> | Action<"ACTION_B", boolean>
>actionA : Action<"ACTION_A", string>
>actionB : Action<"ACTION_B", boolean>
>console.log(action) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>action : Action<"ACTION_A", string> | Action<"ACTION_B", boolean>

call(actionA, printFn);
>call(actionA, printFn) : void
>call : <TName extends string, TPayload>(action: Action<TName, TPayload>, fn: (action: Action<TName, TPayload>) => any) => void
>actionA : Action<"ACTION_A", string>
>printFn : (action: Action<"ACTION_A", string> | Action<"ACTION_B", boolean>) => void

call(actionB, printFn);
>call(actionB, printFn) : void
>call : <TName extends string, TPayload>(action: Action<TName, TPayload>, fn: (action: Action<TName, TPayload>) => any) => void
>actionB : Action<"ACTION_B", boolean>
>printFn : (action: Action<"ACTION_A", string> | Action<"ACTION_B", boolean>) => void