|
| 1 | +=== tests/cases/conformance/types/mapped/mappedTypeAsClauses.ts === |
| 2 | +// Mapped type 'as N' clauses |
| 3 | + |
| 4 | +type Getters<T> = { [P in keyof T & string as `get${capitalize P}`]: () => T[P] }; |
| 5 | +>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0)) |
| 6 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13)) |
| 7 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21)) |
| 8 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13)) |
| 9 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21)) |
| 10 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13)) |
| 11 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21)) |
| 12 | + |
| 13 | +type TG1 = Getters<{ foo: string, bar: number, baz: { z: boolean } }>; |
| 14 | +>TG1 : Symbol(TG1, Decl(mappedTypeAsClauses.ts, 2, 82)) |
| 15 | +>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0)) |
| 16 | +>foo : Symbol(foo, Decl(mappedTypeAsClauses.ts, 3, 20)) |
| 17 | +>bar : Symbol(bar, Decl(mappedTypeAsClauses.ts, 3, 33)) |
| 18 | +>baz : Symbol(baz, Decl(mappedTypeAsClauses.ts, 3, 46)) |
| 19 | +>z : Symbol(z, Decl(mappedTypeAsClauses.ts, 3, 53)) |
| 20 | + |
| 21 | +// Mapped type with 'as N' clause has no constraint on 'in T' clause |
| 22 | + |
| 23 | +type PropDef<K extends keyof any, T> = { name: K, type: T }; |
| 24 | +>PropDef : Symbol(PropDef, Decl(mappedTypeAsClauses.ts, 3, 70)) |
| 25 | +>K : Symbol(K, Decl(mappedTypeAsClauses.ts, 7, 13)) |
| 26 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 7, 33)) |
| 27 | +>name : Symbol(name, Decl(mappedTypeAsClauses.ts, 7, 40)) |
| 28 | +>K : Symbol(K, Decl(mappedTypeAsClauses.ts, 7, 13)) |
| 29 | +>type : Symbol(type, Decl(mappedTypeAsClauses.ts, 7, 49)) |
| 30 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 7, 33)) |
| 31 | + |
| 32 | +type TypeFromDefs<T extends PropDef<keyof any, any>> = { [P in T as P['name']]: P['type'] }; |
| 33 | +>TypeFromDefs : Symbol(TypeFromDefs, Decl(mappedTypeAsClauses.ts, 7, 60)) |
| 34 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 9, 18)) |
| 35 | +>PropDef : Symbol(PropDef, Decl(mappedTypeAsClauses.ts, 3, 70)) |
| 36 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 9, 58)) |
| 37 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 9, 18)) |
| 38 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 9, 58)) |
| 39 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 9, 58)) |
| 40 | + |
| 41 | +type TP1 = TypeFromDefs<{ name: 'a', type: string } | { name: 'b', type: number } | { name: 'a', type: boolean }>; |
| 42 | +>TP1 : Symbol(TP1, Decl(mappedTypeAsClauses.ts, 9, 92)) |
| 43 | +>TypeFromDefs : Symbol(TypeFromDefs, Decl(mappedTypeAsClauses.ts, 7, 60)) |
| 44 | +>name : Symbol(name, Decl(mappedTypeAsClauses.ts, 11, 25)) |
| 45 | +>type : Symbol(type, Decl(mappedTypeAsClauses.ts, 11, 36)) |
| 46 | +>name : Symbol(name, Decl(mappedTypeAsClauses.ts, 11, 55)) |
| 47 | +>type : Symbol(type, Decl(mappedTypeAsClauses.ts, 11, 66)) |
| 48 | +>name : Symbol(name, Decl(mappedTypeAsClauses.ts, 11, 85)) |
| 49 | +>type : Symbol(type, Decl(mappedTypeAsClauses.ts, 11, 96)) |
| 50 | + |
| 51 | +// No array or tuple type mapping when 'as N' clause present |
| 52 | + |
| 53 | +type TA1 = Getters<string[]>; |
| 54 | +>TA1 : Symbol(TA1, Decl(mappedTypeAsClauses.ts, 11, 114)) |
| 55 | +>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0)) |
| 56 | + |
| 57 | +type TA2 = Getters<[number, boolean]>; |
| 58 | +>TA2 : Symbol(TA2, Decl(mappedTypeAsClauses.ts, 15, 29)) |
| 59 | +>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0)) |
| 60 | + |
| 61 | +// Filtering using 'as N' clause |
| 62 | + |
| 63 | +type Methods<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] }; |
| 64 | +>Methods : Symbol(Methods, Decl(mappedTypeAsClauses.ts, 16, 38)) |
| 65 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 20, 13)) |
| 66 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 20, 21)) |
| 67 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 20, 13)) |
| 68 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 20, 13)) |
| 69 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 20, 21)) |
| 70 | +>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) |
| 71 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 20, 21)) |
| 72 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 20, 13)) |
| 73 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 20, 21)) |
| 74 | + |
| 75 | +type TM1 = Methods<{ foo(): number, bar(x: string): boolean, baz: string | number }>; |
| 76 | +>TM1 : Symbol(TM1, Decl(mappedTypeAsClauses.ts, 20, 80)) |
| 77 | +>Methods : Symbol(Methods, Decl(mappedTypeAsClauses.ts, 16, 38)) |
| 78 | +>foo : Symbol(foo, Decl(mappedTypeAsClauses.ts, 21, 20)) |
| 79 | +>bar : Symbol(bar, Decl(mappedTypeAsClauses.ts, 21, 35)) |
| 80 | +>x : Symbol(x, Decl(mappedTypeAsClauses.ts, 21, 40)) |
| 81 | +>baz : Symbol(baz, Decl(mappedTypeAsClauses.ts, 21, 60)) |
| 82 | + |
| 83 | +// Mapping to multiple names using 'as N' clause |
| 84 | + |
| 85 | +type DoubleProp<T> = { [P in keyof T & string as `${P}1` | `${P}2`]: T[P] } |
| 86 | +>DoubleProp : Symbol(DoubleProp, Decl(mappedTypeAsClauses.ts, 21, 85)) |
| 87 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 25, 16)) |
| 88 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 25, 24)) |
| 89 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 25, 16)) |
| 90 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 25, 24)) |
| 91 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 25, 24)) |
| 92 | +>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 25, 16)) |
| 93 | +>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 25, 24)) |
| 94 | + |
| 95 | +type TD1 = DoubleProp<{ a: string, b: number }>; // { a1: string, a2: string, b1: number, b2: number } |
| 96 | +>TD1 : Symbol(TD1, Decl(mappedTypeAsClauses.ts, 25, 75)) |
| 97 | +>DoubleProp : Symbol(DoubleProp, Decl(mappedTypeAsClauses.ts, 21, 85)) |
| 98 | +>a : Symbol(a, Decl(mappedTypeAsClauses.ts, 26, 23)) |
| 99 | +>b : Symbol(b, Decl(mappedTypeAsClauses.ts, 26, 34)) |
| 100 | + |
| 101 | +type TD2 = keyof TD1; // 'a1' | 'a2' | 'b1' | 'b2' |
| 102 | +>TD2 : Symbol(TD2, Decl(mappedTypeAsClauses.ts, 26, 48)) |
| 103 | +>TD1 : Symbol(TD1, Decl(mappedTypeAsClauses.ts, 25, 75)) |
| 104 | + |
| 105 | +type TD3<U> = keyof DoubleProp<U>; // `${keyof U & string}1` | `${keyof U & string}2` |
| 106 | +>TD3 : Symbol(TD3, Decl(mappedTypeAsClauses.ts, 27, 21)) |
| 107 | +>U : Symbol(U, Decl(mappedTypeAsClauses.ts, 28, 9)) |
| 108 | +>DoubleProp : Symbol(DoubleProp, Decl(mappedTypeAsClauses.ts, 21, 85)) |
| 109 | +>U : Symbol(U, Decl(mappedTypeAsClauses.ts, 28, 9)) |
| 110 | + |
0 commit comments