File tree Expand file tree Collapse file tree 3 files changed +222
-0
lines changed
tests/cases/conformance/classes Expand file tree Collapse file tree 3 files changed +222
-0
lines changed Original file line number Diff line number Diff line change
1
+ // @declaration : true
2
+
3
+ type Constructor < T > = new ( ...args : any [ ] ) => T ;
4
+
5
+ class Base {
6
+ constructor ( public x : number , public y : number ) { }
7
+ }
8
+
9
+ class Derived extends Base {
10
+ constructor ( x : number , y : number , public z : number ) {
11
+ super ( x , y ) ;
12
+ }
13
+ }
14
+
15
+ interface Printable {
16
+ print ( ) : void ;
17
+ }
18
+
19
+ const Printable = < T extends Constructor < Base > > ( superClass : T ) : Constructor < Printable > & { message : string } & T =>
20
+ class extends superClass {
21
+ static message = "hello" ;
22
+ print ( ) {
23
+ const output = this . x + "," + this . y ;
24
+ }
25
+ }
26
+
27
+ interface Tagged {
28
+ _tag : string ;
29
+ }
30
+
31
+ function Tagged < T extends Constructor < { } > > ( superClass : T ) : Constructor < Tagged > & T {
32
+ class C extends superClass {
33
+ _tag : string ;
34
+ constructor ( ...args : any [ ] ) {
35
+ super ( ...args ) ;
36
+ this . _tag = "hello" ;
37
+ }
38
+ }
39
+ return C ;
40
+ }
41
+
42
+ const Thing1 = Tagged ( Derived ) ;
43
+ const Thing2 = Tagged ( Printable ( Derived ) ) ;
44
+ Thing2 . message ;
45
+
46
+ function f1 ( ) {
47
+ const thing = new Thing1 ( 1 , 2 , 3 ) ;
48
+ thing . x ;
49
+ thing . _tag ;
50
+ }
51
+
52
+ function f2 ( ) {
53
+ const thing = new Thing2 ( 1 , 2 , 3 ) ;
54
+ thing . x ;
55
+ thing . _tag ;
56
+ thing . print ( ) ;
57
+ }
58
+
59
+ class Thing3 extends Thing2 {
60
+ constructor ( tag : string ) {
61
+ super ( 10 , 20 , 30 ) ;
62
+ this . _tag = tag ;
63
+ }
64
+ test ( ) {
65
+ this . print ( ) ;
66
+ }
67
+ }
Original file line number Diff line number Diff line change
1
+ type Constructor < T > = new ( ...args : any [ ] ) => T ;
2
+
3
+ class Base {
4
+ constructor ( public x : number , public y : number ) { }
5
+ }
6
+
7
+ class Derived extends Base {
8
+ constructor ( x : number , y : number , public z : number ) {
9
+ super ( x , y ) ;
10
+ }
11
+ }
12
+
13
+ const Printable = < T extends Constructor < Base > > ( superClass : T ) => class extends superClass {
14
+ static message = "hello" ;
15
+ print ( ) {
16
+ const output = this . x + "," + this . y ;
17
+ }
18
+ }
19
+
20
+ function Tagged < T extends Constructor < { } > > ( superClass : T ) {
21
+ class C extends superClass {
22
+ _tag : string ;
23
+ constructor ( ...args : any [ ] ) {
24
+ super ( ...args ) ;
25
+ this . _tag = "hello" ;
26
+ }
27
+ }
28
+ return C ;
29
+ }
30
+
31
+ const Thing1 = Tagged ( Derived ) ;
32
+ const Thing2 = Tagged ( Printable ( Derived ) ) ;
33
+ Thing2 . message ;
34
+
35
+ function f1 ( ) {
36
+ const thing = new Thing1 ( 1 , 2 , 3 ) ;
37
+ thing . x ;
38
+ thing . _tag ;
39
+ }
40
+
41
+ function f2 ( ) {
42
+ const thing = new Thing2 ( 1 , 2 , 3 ) ;
43
+ thing . x ;
44
+ thing . _tag ;
45
+ thing . print ( ) ;
46
+ }
47
+
48
+ class Thing3 extends Thing2 {
49
+ constructor ( tag : string ) {
50
+ super ( 10 , 20 , 30 ) ;
51
+ this . _tag = tag ;
52
+ }
53
+ test ( ) {
54
+ this . print ( ) ;
55
+ }
56
+ }
Original file line number Diff line number Diff line change
1
+ // @declaration : true
2
+
3
+ declare class C1 {
4
+ public a : number ;
5
+ protected b : number ;
6
+ private c : number ;
7
+ constructor ( s : string ) ;
8
+ constructor ( n : number ) ;
9
+ }
10
+
11
+ declare class M1 {
12
+ constructor ( ...args : any [ ] ) ;
13
+ p : number ;
14
+ static p : number ;
15
+ }
16
+
17
+ declare class M2 {
18
+ constructor ( ...args : any [ ] ) ;
19
+ f ( ) : number ;
20
+ static f ( ) : number ;
21
+ }
22
+
23
+ declare const Mixed1 : typeof M1 & typeof C1 ;
24
+ declare const Mixed2 : typeof C1 & typeof M1 ;
25
+ declare const Mixed3 : typeof M2 & typeof M1 & typeof C1 ;
26
+ declare const Mixed4 : typeof C1 & typeof M1 & typeof M2 ;
27
+ declare const Mixed5 : typeof M1 & typeof M2 ;
28
+
29
+ function f1 ( ) {
30
+ let x1 = new Mixed1 ( "hello" ) ;
31
+ let x2 = new Mixed1 ( 42 ) ;
32
+ let x3 = new Mixed2 ( "hello" ) ;
33
+ let x4 = new Mixed2 ( 42 ) ;
34
+ let x5 = new Mixed3 ( "hello" ) ;
35
+ let x6 = new Mixed3 ( 42 ) ;
36
+ let x7 = new Mixed4 ( "hello" ) ;
37
+ let x8 = new Mixed4 ( 42 ) ;
38
+ let x9 = new Mixed5 ( ) ;
39
+ }
40
+
41
+ function f2 ( ) {
42
+ let x = new Mixed1 ( "hello" ) ;
43
+ x . a ;
44
+ x . p ;
45
+ Mixed1 . p ;
46
+ }
47
+
48
+ function f3 ( ) {
49
+ let x = new Mixed2 ( "hello" ) ;
50
+ x . a ;
51
+ x . p ;
52
+ Mixed2 . p ;
53
+ }
54
+
55
+ function f4 ( ) {
56
+ let x = new Mixed3 ( "hello" ) ;
57
+ x . a ;
58
+ x . p ;
59
+ x . f ( ) ;
60
+ Mixed3 . p ;
61
+ Mixed3 . f ( ) ;
62
+ }
63
+
64
+ function f5 ( ) {
65
+ let x = new Mixed4 ( "hello" ) ;
66
+ x . a ;
67
+ x . p ;
68
+ x . f ( ) ;
69
+ Mixed4 . p ;
70
+ Mixed4 . f ( ) ;
71
+ }
72
+
73
+ function f6 ( ) {
74
+ let x = new Mixed5 ( ) ;
75
+ x . p ;
76
+ x . f ( ) ;
77
+ Mixed5 . p ;
78
+ Mixed5 . f ( ) ;
79
+ }
80
+
81
+ class C2 extends Mixed1 {
82
+ constructor ( ) {
83
+ super ( "hello" ) ;
84
+ this . a ;
85
+ this . b ;
86
+ this . p ;
87
+ }
88
+ }
89
+
90
+ class C3 extends Mixed3 {
91
+ constructor ( ) {
92
+ super ( 42 ) ;
93
+ this . a ;
94
+ this . b ;
95
+ this . p ;
96
+ this . f ( ) ;
97
+ }
98
+ f ( ) { return super . f ( ) ; }
99
+ }
You can’t perform that action at this time.
0 commit comments