@@ -28,8 +28,9 @@ THE SOFTWARE.
2828
2929// deno-fmt-ignore-file
3030
31+ import { Guard } from '../../../guard/index.ts'
3132import { type TSchema } from '../../types/schema.ts'
32- import { type TLiteral , Literal } from '../../types/literal.ts'
33+ import { type TLiteral , Literal , IsLiteral } from '../../types/literal.ts'
3334import { type TNumber , IsNumber } from '../../types/number.ts'
3435import { type TInteger , IsInteger } from '../../types/integer.ts'
3536
@@ -80,16 +81,23 @@ function FromTupleWithoutIndexer<Types extends TSchema[]>(types: [...Types]): TF
8081// ------------------------------------------------------------------
8182export type TFromTuple < Types extends TSchema [ ] , Indexer extends TSchema ,
8283 Result extends TSchema = (
83- Indexer extends TNumber | TInteger
84- ? TFromTupleWithoutIndexer < Types >
85- : TFromTupleWithIndexer < Types , Indexer >
84+ // length (intrinsic)
85+ Indexer extends TLiteral < infer _ extends 'length' >
86+ ? TLiteral < Types [ 'length' ] >
87+ // indexer
88+ : Indexer extends TNumber | TInteger
89+ ? TFromTupleWithoutIndexer < Types >
90+ : TFromTupleWithIndexer < Types , Indexer >
8691 )
8792> = Result
8893export function FromTuple < Types extends TSchema [ ] , Indexer extends TSchema > ( types : [ ...Types ] , indexer : Indexer ) : TFromTuple < Types , Indexer > {
89-
9094 return (
91- IsNumber ( indexer ) || IsInteger ( indexer )
92- ? FromTupleWithoutIndexer ( types )
93- : FromTupleWithIndexer ( types , indexer )
95+ // length (intrinsic)
96+ IsLiteral ( indexer ) && Guard . IsEqual ( indexer . const , 'length' )
97+ ? Literal ( types . length )
98+ // indexer
99+ : IsNumber ( indexer ) || IsInteger ( indexer )
100+ ? FromTupleWithoutIndexer ( types )
101+ : FromTupleWithIndexer ( types , indexer )
94102 ) as never
95103}
0 commit comments