File: keyofIsLiteralContexualType.types

package info (click to toggle)
node-typescript 3.3.3333-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 324,548 kB
  • sloc: makefile: 6; sh: 3
file content (50 lines) | stat: -rw-r--r-- 1,290 bytes parent folder | download | duplicates (5)
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
=== tests/cases/compiler/keyofIsLiteralContexualType.ts ===
// keyof T is a literal contextual type

function foo<T extends { a: string, b: string }>() {
>foo : <T extends { a: string; b: string; }>() => void
>a : string
>b : string

    let a: (keyof T)[] = ["a", "b"];
>a : (keyof T)[]
>["a", "b"] : ("a" | "b")[]
>"a" : "a"
>"b" : "b"

    let b: (keyof T)[] = ["a", "b", "c"];
>b : (keyof T)[]
>["a", "b", "c"] : ("a" | "b" | "c")[]
>"a" : "a"
>"b" : "b"
>"c" : "c"
}

// Repro from #12455

declare function pick<T, K extends keyof T>(obj: T, propNames: K[]): Pick<T, K>;
>pick : <T, K extends keyof T>(obj: T, propNames: K[]) => Pick<T, K>
>obj : T
>propNames : K[]

let x = pick({ a: 10, b: 20, c: 30 }, ["a", "c"]);
>x : Pick<{ a: number; b: number; c: number; }, "a" | "c">
>pick({ a: 10, b: 20, c: 30 }, ["a", "c"]) : Pick<{ a: number; b: number; c: number; }, "a" | "c">
>pick : <T, K extends keyof T>(obj: T, propNames: K[]) => Pick<T, K>
>{ a: 10, b: 20, c: 30 } : { a: number; b: number; c: number; }
>a : number
>10 : 10
>b : number
>20 : 20
>c : number
>30 : 30
>["a", "c"] : ("a" | "c")[]
>"a" : "a"
>"c" : "c"

let b = x.b;  // Error
>b : any
>x.b : any
>x : Pick<{ a: number; b: number; c: number; }, "a" | "c">
>b : any