@@ -31,15 +31,19 @@ let obj1 = {
31
31
type Point = {
32
32
x : number ;
33
33
y: number ;
34
- moveBy ( dx : number , dy : number ) : void ;
34
+ z ? : number ;
35
+ moveBy ( dx : number , dy : number , dz ? : number ) : void ;
35
36
}
36
37
37
38
let p1 : Point = {
38
39
x : 10 ,
39
40
y : 20 ,
40
- moveBy ( dx , dy ) {
41
+ moveBy ( dx , dy , dz ) {
41
42
this . x += dx ;
42
43
this . y += dy ;
44
+ if ( this . z && dz ) {
45
+ this . z += dz ;
46
+ }
43
47
}
44
48
} ;
45
49
@@ -48,9 +52,12 @@ declare function f1(p: Point): void;
48
52
f1 ( {
49
53
x : 10 ,
50
54
y : 20 ,
51
- moveBy ( dx , dy ) {
55
+ moveBy ( dx , dy , dz ) {
52
56
this . x += dx ;
53
57
this . y += dy ;
58
+ if ( this . z && dz ) {
59
+ this . z += dz ;
60
+ }
54
61
}
55
62
} ) ;
56
63
@@ -94,6 +101,51 @@ let x2 = makeObject2({
94
101
}
95
102
} ) ;
96
103
104
+ // Check pattern similar to Object.defineProperty and Object.defineProperties
105
+
106
+ type PropDesc < T > = {
107
+ value ?: T ;
108
+ get ?( ) : T ;
109
+ set ?( value : T ) : void ;
110
+ }
111
+
112
+ type PropDescMap < T > = {
113
+ [ K in keyof T ] : PropDesc < T [ K ] > ;
114
+ }
115
+
116
+ declare function defineProp < T , K extends string , U > ( obj : T , name : K , desc : PropDesc < U > & ThisType < T > ) : T & Record < K , U > ;
117
+
118
+ declare function defineProps < T , U > ( obj : T , descs : PropDescMap < U > & ThisType < T > ) : T & U ;
119
+
120
+ let p10 = defineProp ( p1 , "foo" , { value : 42 } ) ;
121
+ p10 . foo = p10 . foo + 1 ;
122
+
123
+ let p11 = defineProp ( p1 , "bar" , {
124
+ get ( ) {
125
+ return this . x ;
126
+ } ,
127
+ set ( value : number ) {
128
+ this . x = value ;
129
+ }
130
+ } ) ;
131
+ p11 . bar = p11 . bar + 1 ;
132
+
133
+ let p12 = defineProps ( p1 , {
134
+ foo : {
135
+ value : 42
136
+ } ,
137
+ bar : {
138
+ get ( ) : number {
139
+ return this . x ;
140
+ } ,
141
+ set ( value : number ) {
142
+ this . x = value ;
143
+ }
144
+ }
145
+ } ) ;
146
+ p12 . foo = p12 . foo + 1 ;
147
+ p12 . bar = p12 . bar + 1 ;
148
+
97
149
// Proof of concept for typing of Vue.js
98
150
99
151
type Accessors < T > = { [ K in keyof T ] : ( ( ) => T [ K ] ) | Computed < T [ K ] > } ;
@@ -168,17 +220,23 @@ var obj1 = {
168
220
var p1 = {
169
221
x : 10 ,
170
222
y : 20 ,
171
- moveBy : function ( dx , dy ) {
223
+ moveBy : function ( dx , dy , dz ) {
172
224
this . x += dx ;
173
225
this . y += dy ;
226
+ if ( this . z && dz ) {
227
+ this . z += dz ;
228
+ }
174
229
}
175
230
} ;
176
231
f1 ( {
177
232
x : 10 ,
178
233
y : 20 ,
179
- moveBy : function ( dx , dy ) {
234
+ moveBy : function ( dx , dy , dz ) {
180
235
this . x += dx ;
181
236
this . y += dy ;
237
+ if ( this . z && dz ) {
238
+ this . z += dz ;
239
+ }
182
240
}
183
241
} ) ;
184
242
var x1 = makeObject ( {
@@ -199,6 +257,32 @@ var x2 = makeObject2({
199
257
}
200
258
}
201
259
} ) ;
260
+ var p10 = defineProp ( p1 , "foo" , { value : 42 } ) ;
261
+ p10 . foo = p10 . foo + 1 ;
262
+ var p11 = defineProp ( p1 , "bar" , {
263
+ get : function ( ) {
264
+ return this . x ;
265
+ } ,
266
+ set : function ( value ) {
267
+ this . x = value ;
268
+ }
269
+ } ) ;
270
+ p11 . bar = p11 . bar + 1 ;
271
+ var p12 = defineProps ( p1 , {
272
+ foo : {
273
+ value : 42
274
+ } ,
275
+ bar : {
276
+ get : function ( ) {
277
+ return this . x ;
278
+ } ,
279
+ set : function ( value ) {
280
+ this . x = value ;
281
+ }
282
+ }
283
+ } ) ;
284
+ p12 . foo = p12 . foo + 1 ;
285
+ p12 . bar = p12 . bar + 1 ;
202
286
var vue = new Vue ( {
203
287
data : function ( ) { return ( { x : 1 , y : 2 } ) ; } ,
204
288
methods : {
@@ -240,7 +324,8 @@ declare let obj1: {
240
324
declare type Point = {
241
325
x : number ;
242
326
y : number ;
243
- moveBy ( dx : number , dy : number ) : void ;
327
+ z ?: number ;
328
+ moveBy ( dx : number , dy : number , dz ? : number ) : void ;
244
329
} ;
245
330
declare let p1 : Point ;
246
331
declare function f1 ( p : Point ) : void ;
@@ -266,6 +351,22 @@ declare let x2: {
266
351
} & {
267
352
moveBy ( dx : number , dy : number ) : void ;
268
353
} ;
354
+ declare type PropDesc < T > = {
355
+ value ?: T ;
356
+ get ?( ) : T ;
357
+ set ?( value : T ) : void ;
358
+ } ;
359
+ declare type PropDescMap < T > = {
360
+ [ K in keyof T ] : PropDesc < T [ K ] > ;
361
+ } ;
362
+ declare function defineProp < T , K extends string, U > ( obj : T , name : K , desc : PropDesc < U > & ThisType < T > ) : T & Record < K , U > ;
363
+ declare function defineProps < T, U > ( obj : T , descs : PropDescMap < U > & ThisType < T > ) : T & U ;
364
+ declare let p10 : Point & Record < "foo" , number > ;
365
+ declare let p11 : Point & Record < "bar" , number > ;
366
+ declare let p12 : Point & {
367
+ foo : number ;
368
+ bar : number ;
369
+ } ;
269
370
declare type Accessors < T > = {
270
371
[ K in keyof T ] : ( ( ) => T [ K ] ) | Computed < T [ K ] > ;
271
372
} ;
0 commit comments