@@ -15,20 +15,32 @@ import {
15
15
createContinuousRangeUntypedTarget ,
16
16
} from "../targetUtil/createContinuousRange" ;
17
17
18
- /** Parameters supported by most target classes */
19
- export interface CommonTargetParameters {
18
+ /** Parameters supported by all target classes */
19
+ export interface MinimumTargetParameters {
20
20
readonly editor : TextEditor ;
21
21
readonly isReversed : boolean ;
22
- readonly contentRange : Range ;
23
22
readonly thatTarget ?: Target ;
24
23
}
25
24
25
+ /** Parameters supported by most target classes */
26
+ export interface CommonTargetParameters extends MinimumTargetParameters {
27
+ readonly contentRange : Range ;
28
+ }
29
+
26
30
export interface CloneWithParameters {
27
31
readonly thatTarget ?: Target ;
28
32
readonly contentRange ?: Range ;
29
33
}
30
34
31
- export default abstract class BaseTarget implements Target {
35
+ /**
36
+ * An abstract target. All targets subclass this.
37
+ *
38
+ * @template TParameters The constructor parameters.
39
+ */
40
+ export default abstract class BaseTarget <
41
+ in out TParameters extends MinimumTargetParameters ,
42
+ > implements Target
43
+ {
32
44
protected readonly state : CommonTargetParameters ;
33
45
isLine = false ;
34
46
isToken = true ;
@@ -39,7 +51,7 @@ export default abstract class BaseTarget implements Target {
39
51
isNotebookCell = false ;
40
52
isWord = false ;
41
53
42
- constructor ( parameters : CommonTargetParameters ) {
54
+ constructor ( parameters : TParameters & CommonTargetParameters ) {
43
55
this . state = {
44
56
editor : parameters . editor ,
45
57
isReversed : parameters . isReversed ,
@@ -112,16 +124,16 @@ export default abstract class BaseTarget implements Target {
112
124
throw new NoContainingScopeError ( "boundary" ) ;
113
125
}
114
126
115
- readonly cloneWith = ( parameters : CloneWithParameters ) => {
127
+ private cloneWith ( parameters : CloneWithParameters ) {
116
128
const constructor = Object . getPrototypeOf ( this ) . constructor ;
117
129
118
130
return new constructor ( {
119
131
...this . getCloneParameters ( ) ,
120
132
...parameters ,
121
133
} ) ;
122
- } ;
134
+ }
123
135
124
- protected abstract getCloneParameters ( ) : object ;
136
+ protected abstract getCloneParameters ( ) : TParameters ;
125
137
126
138
createContinuousRangeTarget (
127
139
isReversed : boolean ,
@@ -170,9 +182,8 @@ export default abstract class BaseTarget implements Target {
170
182
*
171
183
* @returns The object to be used for determining equality
172
184
*/
173
- protected getEqualityParameters ( ) : object {
174
- const { thatTarget, ...otherCloneParameters } =
175
- this . getCloneParameters ( ) as { thatTarget ?: Target } ;
185
+ protected getEqualityParameters ( ) : Omit < TParameters , "thatTarget" > {
186
+ const { thatTarget, ...otherCloneParameters } = this . getCloneParameters ( ) ;
176
187
177
188
return {
178
189
...otherCloneParameters ,
0 commit comments