@@ -215,7 +215,7 @@ export type Candidate =
215215 raw : string
216216 }
217217
218- export function cloneCandidate ( candidate : Candidate ) : Candidate {
218+ export function cloneCandidate < T extends Candidate > ( candidate : T ) : T {
219219 switch ( candidate . kind ) {
220220 case 'arbitrary' :
221221 return {
@@ -228,7 +228,7 @@ export function cloneCandidate(candidate: Candidate): Candidate {
228228 variants : candidate . variants . map ( cloneVariant ) ,
229229 important : candidate . important ,
230230 raw : candidate . raw ,
231- }
231+ } satisfies Extract < Candidate , { kind : 'arbitrary' } > as T
232232
233233 case 'static' :
234234 return {
@@ -237,7 +237,7 @@ export function cloneCandidate(candidate: Candidate): Candidate {
237237 variants : candidate . variants . map ( cloneVariant ) ,
238238 important : candidate . important ,
239239 raw : candidate . raw ,
240- }
240+ } satisfies Extract < Candidate , { kind : 'static' } > as T
241241
242242 case 'functional' :
243243 return {
@@ -262,21 +262,28 @@ export function cloneCandidate(candidate: Candidate): Candidate {
262262 variants : candidate . variants . map ( cloneVariant ) ,
263263 important : candidate . important ,
264264 raw : candidate . raw ,
265- }
265+ } satisfies Extract < Candidate , { kind : 'functional' } > as T
266266
267267 default :
268268 candidate satisfies never
269269 throw new Error ( 'Unknown candidate kind' )
270270 }
271271}
272272
273- export function cloneVariant ( variant : Variant ) : Variant {
273+ export function cloneVariant < T extends Variant > ( variant : T ) : T {
274274 switch ( variant . kind ) {
275275 case 'arbitrary' :
276- return { kind : variant . kind , selector : variant . selector , relative : variant . relative }
276+ return {
277+ kind : variant . kind ,
278+ selector : variant . selector ,
279+ relative : variant . relative ,
280+ } satisfies Extract < Variant , { kind : 'arbitrary' } > as T
277281
278282 case 'static' :
279- return { kind : variant . kind , root : variant . root }
283+ return { kind : variant . kind , root : variant . root } satisfies Extract <
284+ Variant ,
285+ { kind : 'static' }
286+ > as T
280287
281288 case 'functional' :
282289 return {
@@ -286,7 +293,7 @@ export function cloneVariant(variant: Variant): Variant {
286293 modifier : variant . modifier
287294 ? { kind : variant . modifier . kind , value : variant . modifier . value }
288295 : null ,
289- }
296+ } satisfies Extract < Variant , { kind : 'functional' } > as T
290297
291298 case 'compound' :
292299 return {
@@ -296,7 +303,7 @@ export function cloneVariant(variant: Variant): Variant {
296303 modifier : variant . modifier
297304 ? { kind : variant . modifier . kind , value : variant . modifier . value }
298305 : null ,
299- }
306+ } satisfies Extract < Variant , { kind : 'compound' } > as T
300307
301308 default :
302309 variant satisfies never
0 commit comments