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 105 106 107 108 109 110
|
=== tests/cases/conformance/types/mapped/mappedTypeConstraints.ts ===
function f0<T extends { a: string, b: string }>(obj: Pick<T, Extract<keyof T, 'b'>>) {
>f0 : <T extends { a: string; b: string; }>(obj: Pick<T, Extract<keyof T, 'b'>>) => void
>a : string
>b : string
>obj : Pick<T, Extract<keyof T, "b">>
obj.b;
>obj.b : T["b"]
>obj : Pick<T, Extract<keyof T, "b">>
>b : T["b"]
}
function f1<T extends { a: string, b: string }>(obj: Pick<T, Exclude<keyof T, 'a'>>) {
>f1 : <T extends { a: string; b: string; }>(obj: Pick<T, Exclude<keyof T, 'a'>>) => void
>a : string
>b : string
>obj : Pick<T, Exclude<keyof T, "a">>
obj.b;
>obj.b : T["b"]
>obj : Pick<T, Exclude<keyof T, "a">>
>b : T["b"]
}
function f2<T extends { a: string, b: string }, U extends { b: string, c: string }>(obj: Pick<T | U, keyof (T | U)>) {
>f2 : <T extends { a: string; b: string; }, U extends { b: string; c: string; }>(obj: Pick<T | U, keyof (T | U)>) => void
>a : string
>b : string
>b : string
>c : string
>obj : Pick<T | U, keyof T & keyof U>
obj.b;
>obj.b : (T | U)["b"]
>obj : Pick<T | U, keyof T & keyof U>
>b : (T | U)["b"]
}
function f3<T extends { a: string, b: string }, U extends { b: string, c: string }>(obj: Pick<T & U, keyof (T & U)>) {
>f3 : <T extends { a: string; b: string; }, U extends { b: string; c: string; }>(obj: Pick<T & U, keyof (T & U)>) => void
>a : string
>b : string
>b : string
>c : string
>obj : Pick<T & U, keyof T | keyof U>
obj.a;
>obj.a : (T & U)["a"]
>obj : Pick<T & U, keyof T | keyof U>
>a : (T & U)["a"]
obj.b;
>obj.b : (T & U)["b"]
>obj : Pick<T & U, keyof T | keyof U>
>b : (T & U)["b"]
obj.c;
>obj.c : (T & U)["c"]
>obj : Pick<T & U, keyof T | keyof U>
>c : (T & U)["c"]
}
function f4<T extends { a: string, b: string }>(obj: Record<Exclude<keyof T, 'b'> | 'c', string>) {
>f4 : <T extends { a: string; b: string; }>(obj: Record<Exclude<keyof T, 'b'> | 'c', string>) => void
>a : string
>b : string
>obj : Record<"c" | Exclude<keyof T, "b">, string>
obj.a;
>obj.a : string
>obj : Record<"c" | Exclude<keyof T, "b">, string>
>a : string
obj.c;
>obj.c : string
>obj : Record<"c" | Exclude<keyof T, "b">, string>
>c : string
}
// Repro from #28821
type TargetProps = {
>TargetProps : { foo: string; bar: string; }
foo: string,
>foo : string
bar: string
>bar : string
};
const modifier = <T extends TargetProps>(targetProps: T) => {
>modifier : <T extends TargetProps>(targetProps: T) => void
><T extends TargetProps>(targetProps: T) => { let {bar, ...rest} = targetProps; rest.foo;} : <T extends TargetProps>(targetProps: T) => void
>targetProps : T
let {bar, ...rest} = targetProps;
>bar : string
>rest : Omit<T, "bar">
>targetProps : T
rest.foo;
>rest.foo : T["foo"]
>rest : Omit<T, "bar">
>foo : T["foo"]
};
|