File: inferenceAndHKTs.types

package info (click to toggle)
node-typescript 5.1.6%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 492,516 kB
  • sloc: javascript: 2,078,951; makefile: 6; sh: 1
file content (64 lines) | stat: -rw-r--r-- 1,741 bytes parent folder | download
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
=== tests/cases/compiler/inferenceAndHKTs.ts ===
// Repro from #53970

export interface TypeLambda {
    readonly A: unknown;
>A : unknown
}

export interface TypeClass<F extends TypeLambda> {
    readonly _F: F;
>_F : F
}

export type Apply<F extends TypeLambda, A> = F extends { readonly type: unknown }
>Apply : Apply<F, A>
>type : unknown

    ? (F & { readonly A: A })['type']
>A : A

    : { readonly F: F, readonly A: A };
>F : F
>A : A

export interface T<A> {
    value: A;
>value : A
}

export interface TTypeLambda extends TypeLambda {
    readonly type: T<this["A"]>;
>type : T<this["A"]>
}

export declare const map: <F extends TypeLambda>(F: TypeClass<F>) => <A, B>(a: Apply<F, A>, f: (a: A) => B) => Apply<F, B>;
>map : <F extends TypeLambda>(F: TypeClass<F>) => <A, B>(a: Apply<F, A>, f: (a: A) => B) => Apply<F, B>
>F : TypeClass<F>
>a : Apply<F, A>
>f : (a: A) => B
>a : A

declare const typeClass: TypeClass<TTypeLambda>;
>typeClass : TypeClass<TTypeLambda>

declare const a: T<number>;
>a : T<number>

const x1 = map(typeClass);
>x1 : <A, B>(a: T<A>, f: (a: A) => B) => T<B>
>map(typeClass) : <A, B>(a: T<A>, f: (a: A) => B) => T<B>
>map : <F extends TypeLambda>(F: TypeClass<F>) => <A, B>(a: Apply<F, A>, f: (a: A) => B) => Apply<F, B>
>typeClass : TypeClass<TTypeLambda>

const x2 = map(typeClass)(a, (_) => _);  // T<number>
>x2 : T<number>
>map(typeClass)(a, (_) => _) : T<number>
>map(typeClass) : <A, B>(a: T<A>, f: (a: A) => B) => T<B>
>map : <F extends TypeLambda>(F: TypeClass<F>) => <A, B>(a: Apply<F, A>, f: (a: A) => B) => Apply<F, B>
>typeClass : TypeClass<TTypeLambda>
>a : T<number>
>(_) => _ : (_: number) => number
>_ : number
>_ : number