Skip to content

Commit 7690306

Browse files
committed
Additional Work
1 parent 59e912a commit 7690306

4 files changed

Lines changed: 31 additions & 87 deletions

File tree

example/index.ts

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,35 @@
1+
import { Settings} from 'typebox/system'
12
import Type from 'typebox'
23

3-
// investigating Extends logic
4+
Settings.Set({ enumerableKind: true })
45

5-
const { A, B, C, Vector } = Type.Script(`
6-
7-
type A = if number then 1 // 1 | unknown - (technically 1 & (unknown & not number))
8-
type B = if number then 1 else 'hello' // 1 | 'hello'
9-
type C = if number then 1 else never // 1
106

11-
// which approximates as the following
7+
type IfThenElse<If, Then, Else, Right> = If extends Right
8+
? (Then extends Right ? true : false)
9+
: (Else extends Right ? true : false)
1210

13-
type IfThenElse<If, Then, Else> = (If & Then) | Exclude<Else, If>
11+
type X = IfThenElse<boolean, true, false, true> // boolean
12+
type Y = IfThenElse<boolean, false, true, false> // boolean
1413

15-
// and would be used in contexts like the following
14+
// const T1: Type.TLiteral<false> = Type.Script(`(if number then 1 else string) extends 1 ? true : false`) // false ✓
15+
// const T2: Type.TLiteral<true> = Type.Script(`(if number then 1 else never) extends 1 ? true : false`) // true ✓
16+
// const T3: Type.TLiteral<true> = Type.Script(`(if string then number else never) extends number ? true : false`) // true ✓
17+
// const T4: Type.TLiteral<true> = Type.Script(`(if number then number else never) extends number ? true : false`) // true ✓
18+
// const T5: Type.TLiteral<false> = Type.Script(`(if number then 1) extends 1 ? true : false`) // false ✓
19+
// const T6: Type.TLiteral<true> = Type.Script(`(if number then 1) extends unknown ? true : false`) // true ✓
20+
// const T7: Type.TLiteral<true> = Type.Script(`(if string then "hello" else never) extends string ? true : false`) // true ✓
21+
// const T8: Type.TLiteral<true> = Type.Script(`(if number then 2 else never) extends number ? true : false`) // true ✓
22+
// const T9: Type.TLiteral<true> = Type.Script(`(if number then 2 else never) extends 2 ? true : false`) // true ✓
23+
// const T10: Type.TLiteral<false> = Type.Script(`(if number then 2 else never) extends 1 ? true : false`) // false
24+
// const T11: Type.TLiteral<true> = Type.Script(`(if boolean then true else never) extends true ? true : false`) // true ✓
25+
// const T12: Type.TLiteral<true> = Type.Script(`(if boolean then true else false) extends true ? true : false`) // true ✓
26+
// const T13: Type.TLiteral<true> = Type.Script(`(if boolean then false else true) extends false ? true : false`) // true ✓
27+
// const T14: Type.TLiteral<true> = Type.Script(`(if unknown then 1 else never) extends 1 ? true : false`) // true ✓
28+
// const T15: Type.TLiteral<true> = Type.Script(`(if never then 1 else never) extends 1 ? true : false`) // true ✓
1629

17-
// Rules
18-
type RuleA = if { x: 1 } then { y: 1 }
19-
type RuleB = if { x: 2 } then { y: 2 }
20-
type RuleC = if { x: 3 } then { y: 3 }
30+
// type Xs = boolean extends true ? 1 : 2
2131

2232

23-
// Vector Intersected with Rules
24-
type Vector = {
25-
x: number
26-
y: number
27-
} & if { x: 1 } then { y: 1 } else
28-
if { x: 2 } then { y: 2 }
29-
`)
30-
31-
type A = Type.Static<typeof A>
32-
type B = Type.Static<typeof B>
33-
type C = Type.Static<typeof C>
34-
35-
type Vector = Type.Static<typeof Vector>
3633

3734

3835

src/type/engine/evaluate/evaluate.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,27 @@ THE SOFTWARE.
3131
import { Guard } from '../../../guard/index.ts'
3232
import { type TSchema } from '../../types/schema.ts'
3333
import { type TIfThenElse, IsIfThenElse } from '../../types/if_then_else.ts'
34-
import { type TIntersect, IsIntersect } from '../../types/intersect.ts'
34+
import { type TIntersect, IsIntersect, Intersect } from '../../types/intersect.ts'
3535
import { type TUnion, Union, IsUnion } from '../../types/union.ts'
3636
import { type TNever, Never } from '../../types/never.ts'
3737

3838
import { type TDistribute, Distribute } from './distribute.ts'
3939
import { type TBroaden, Broaden } from './broaden.ts'
40-
import { type TExcludeAction, ExcludeAction } from '../exclude/index.ts'
40+
import { type TExcludeOperation, ExcludeOperation } from '../exclude/operation.ts'
4141

4242
// ------------------------------------------------------------------
4343
// EvaluateIfThenElse
4444
// ------------------------------------------------------------------
4545
export type TEvaluateIfThenElse<If extends TSchema, Then extends TSchema, Else extends TSchema,
46-
Left extends TSchema = TEvaluateIntersect<[If, Then]>,
47-
Right extends TSchema = TEvaluateType<TExcludeAction<Else, Left>>,
48-
Result extends TSchema = TEvaluateUnion<[Left, Right]>
46+
Intersect extends TSchema = TIntersect<[If, Then]>,
47+
Negated extends TSchema = TExcludeOperation<Else, If>,
48+
Result extends TSchema = TEvaluateUnion<[Intersect, Negated]>
4949
> = Result
5050
export function EvaluateIfThenElse<If extends TSchema, Then extends TSchema, Else extends TSchema>
5151
(if_: If, then_: Then, else_: Else): TEvaluateIfThenElse<If, Then, Else> {
52-
const left = EvaluateIntersect([if_, then_])
53-
const right = EvaluateType(ExcludeAction(else_, left, {}))
54-
const result = EvaluateUnion([left, right])
52+
const intersect = Intersect([if_, then_])
53+
const negation = ExcludeOperation(else_, if_)
54+
const result = EvaluateUnion([intersect, negation])
5555
return result as never
5656
}
5757
// ------------------------------------------------------------------

src/type/extends/extends_left.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import { type TExtendsBoolean, ExtendsBoolean } from './boolean.ts'
3636
import { type TExtendsConstructor, ExtendsConstructor } from './constructor.ts'
3737
import { type TExtendsEnum, ExtendsEnum } from './enum.ts'
3838
import { type TExtendsFunction, ExtendsFunction } from './function.ts'
39-
import { type TExtendsIfThenElse, ExtendsIfThenElse } from './if_then_else.ts'
4039
import { type TExtendsInteger, ExtendsInteger } from './integer.ts'
4140
import { type TExtendsIntersect, ExtendsIntersect } from './intersect.ts'
4241
import { type TExtendsIterator, ExtendsIterator } from './iterator.ts'
@@ -66,7 +65,6 @@ import { type TBoolean, IsBoolean } from '../types/boolean.ts'
6665
import { type TConstructor, IsConstructor } from '../types/constructor.ts'
6766
import { type TEnum, type TEnumValue, IsEnum } from '../types/enum.ts'
6867
import { type TFunction, IsFunction } from '../types/function.ts'
69-
import { type TIfThenElse, IsIfThenElse } from '../types/if_then_else.ts'
7068
import { type TInteger, IsInteger } from '../types/integer.ts'
7169
import { type TIntersect, IsIntersect } from '../types/intersect.ts'
7270
import { type TIterator, IsIterator } from '../types/iterator.ts'
@@ -101,7 +99,6 @@ export type TExtendsLeft<Inferred extends TProperties, Left extends TSchema, Rig
10199
Left extends TConstructor<infer Parameters extends TSchema[], infer InstanceType extends TSchema> ? TExtendsConstructor<Inferred, Parameters, InstanceType, Right> :
102100
Left extends TEnum<infer Values extends TEnumValue[]> ? TExtendsEnum<Inferred, TEnum<Values>, Right> :
103101
Left extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? TExtendsFunction<Inferred, Parameters, ReturnType, Right> :
104-
Left extends TIfThenElse<infer If extends TSchema, infer Then extends TSchema, infer Else extends TSchema> ? TExtendsIfThenElse<Inferred, If, Then, Else, Right> :
105102
Left extends TInteger ? TExtendsInteger<Inferred, Left, Right> :
106103
Left extends TIntersect<infer Types extends TSchema[]> ? TExtendsIntersect<Inferred, Types, Right> :
107104
Left extends TIterator<infer Type extends TSchema> ? TExtendsIterator<Inferred, Type, Right> :
@@ -133,7 +130,6 @@ export function ExtendsLeft<Inferred extends TProperties, Left extends TSchema,
133130
IsConstructor(left) ? ExtendsConstructor(inferred, left.parameters, left.instanceType, right) :
134131
IsEnum(left) ? ExtendsEnum(inferred, left, right) :
135132
IsFunction(left) ? ExtendsFunction(inferred, left.parameters, left.returnType, right) :
136-
IsIfThenElse(left) ? ExtendsIfThenElse(inferred, left.if, left.then, left.else, right) :
137133
IsInteger(left) ? ExtendsInteger(inferred, left, right) :
138134
IsIntersect(left) ? ExtendsIntersect(inferred, left.allOf, right) :
139135
IsIterator(left) ? ExtendsIterator(inferred, left.iteratorItems, right) :

src/type/extends/if_then_else.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)