File: subtypingWithObjectMembersOptionality.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 (121 lines) | stat: -rw-r--r-- 2,612 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
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
111
112
113
114
115
116
117
118
119
120
121
=== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembersOptionality.ts ===
// Derived member is not optional but base member is, should be ok

interface Base { foo: string; }
>foo : string

interface Derived extends Base { bar: string; }
>bar : string

interface Derived2 extends Derived { baz: string; }
>baz : string

// S is a subtype of a type T, and T is a supertype of S, if one of the following is true, where S' denotes the apparent type (section 3.8.1) of S:
//   - S' and T are object types and, for each member M in T, one of the following is true:
//      - M is a property and S' contains a property N where
//          M and N have the same name,
//          the type of N is a subtype of that of M,
//          M and N are both public or both private, and
//          if M is a required property, N is also a required property.
//      - M is an optional property and S' contains no property of the same name as M.
interface T {
    Foo?: Base;
>Foo : Base
}

interface S extends T {
    Foo: Derived
>Foo : Derived
}

interface T2 {
    1?: Base; 
>1 : Base
}

interface S2 extends T2 {
    1: Derived;
>1 : Derived
}

interface T3 {
    '1'?: Base;
>'1' : Base
}

interface S3 extends T3 {
    '1.': Derived;
>'1.' : Derived
}

// object literal case
var a: { Foo?: Base; };
>a : { Foo?: Base; }
>Foo : Base

var b = { Foo: <Derived>null };
>b : { Foo: Derived; }
>{ Foo: <Derived>null } : { Foo: Derived; }
>Foo : Derived
><Derived>null : Derived
>null : null

var r = true ? a : b;
>r : { Foo?: Base; }
>true ? a : b : { Foo?: Base; }
>true : true
>a : { Foo?: Base; }
>b : { Foo: Derived; }

module TwoLevels {
>TwoLevels : typeof TwoLevels

    interface T {
        Foo?: Base;
>Foo : Base
    }

    interface S extends T {
        Foo: Derived2 
>Foo : Derived2
    }

    interface T2 {
        1?: Base;
>1 : Base
    }

    interface S2 extends T2 {
        1: Derived2;
>1 : Derived2
    }

    interface T3 {
        '1'?: Base;
>'1' : Base
    }

    interface S3 extends T3 {
        '1.': Derived2;
>'1.' : Derived2
    }

    // object literal case
    var a: { Foo?: Base; };
>a : { Foo?: Base; }
>Foo : Base

    var b = { Foo: <Derived2>null };
>b : { Foo: Derived2; }
>{ Foo: <Derived2>null } : { Foo: Derived2; }
>Foo : Derived2
><Derived2>null : Derived2
>null : null

    var r = true ? a : b;
>r : { Foo?: Base; }
>true ? a : b : { Foo?: Base; }
>true : true
>a : { Foo?: Base; }
>b : { Foo: Derived2; }
}