@@ -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