File: mappedTypeAsClauseRelationships.types

package info (click to toggle)
node-typescript 5.0.4%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 459,116 kB
  • sloc: javascript: 1,972,754; makefile: 6; sh: 1
file content (64 lines) | stat: -rw-r--r-- 1,680 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
=== tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts ===
// From original issue #45212:
type Methods<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] };
>Methods : Methods<T>

type H<T> = T[keyof Methods<T>]; // Ok
>H : H<T>

// `Filter<T>` only filters out some keys of `T`.
type Filter<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] };
>Filter : Filter<T>

// `Modify<T>` might modify some keys of `T`.
type Modify<T> = { [P in keyof T as P extends string? `bool${P}`: P]: T[P] };
>Modify : Modify<T>

function fun<T>(val: T) {
>fun : <T>(val: T) => void
>val : T

    let x: Filter<T> = val; // Ok
>x : Filter<T>
>val : T

    let y: Modify<T> = val; // Error
>y : Modify<T>
>val : T
}

type FilterInclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]+?: T[P] };
>FilterInclOpt : FilterInclOpt<T>

type ModifyInclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]+?: T[P] };
>ModifyInclOpt : ModifyInclOpt<T>

type FilterExclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]-?: T[P] };
>FilterExclOpt : FilterExclOpt<T>

type ModifyExclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]-?: T[P] };
>ModifyExclOpt : ModifyExclOpt<T>

function fun2<T>(val: T) {
>fun2 : <T>(val: T) => void
>val : T

    let x: FilterInclOpt<T> = val; // Ok
>x : FilterInclOpt<T>
>val : T

    let y: ModifyInclOpt<T> = val; // Ok
>y : ModifyInclOpt<T>
>val : T

    let z: FilterExclOpt<T> = val; // Error
>z : FilterExclOpt<T>
>val : T

    let w: ModifyExclOpt<T> = val; // Error
>w : ModifyExclOpt<T>
>val : T
}