Publish
This commit is contained in:
56
changelog/0.17.6.md
Normal file
56
changelog/0.17.6.md
Normal file
@@ -0,0 +1,56 @@
|
||||
## [0.17.6](https://www.npmjs.com/package/@sinclair/typebox/v/0.17.6)
|
||||
|
||||
Changes:
|
||||
|
||||
- Added `Type.Rec(...)` function.
|
||||
|
||||
Notes:
|
||||
|
||||
This update introduces the `Type.Rec()` function for enabling Recursive Types. Please note that due to current inference limitations in TypeScript, TypeBox is unable to infer the type and resolves inner types to `any`.
|
||||
|
||||
This functionality enables for complex self referential schemas to be composed. The following creates a binary expression syntax node with the expression self referential for left and right operands.
|
||||
|
||||
```typescript
|
||||
const Operator = Type.Union([
|
||||
Type.Literal('+'),
|
||||
Type.Literal('-'),
|
||||
Type.Literal('/'),
|
||||
Type.Literal('*')
|
||||
])
|
||||
|
||||
type Expression = Static<typeof Expression>
|
||||
|
||||
// Defines a self referencing type.
|
||||
const Expression = Type.Rec(Self => Type.Object({
|
||||
left: Type.Union([Self, Type.Number()]),
|
||||
right: Type.Union([Self, Type.Number()]),
|
||||
operator: Operator
|
||||
}))
|
||||
|
||||
function evaluate(expression: Expression): number {
|
||||
const left = typeof expression.left !== 'number'
|
||||
? evaluate(expression.left as Expression) // assert as Expression
|
||||
: expression.left
|
||||
const right = typeof expression.right !== 'number'
|
||||
? evaluate(expression.right as Expression) // assert as Expression
|
||||
: expression.right
|
||||
switch(expression.operator) {
|
||||
case '+': return left + right
|
||||
case '-': return left - right
|
||||
case '*': return left * right
|
||||
case '/': return left / right
|
||||
}
|
||||
}
|
||||
|
||||
const result = evaluate({
|
||||
left: {
|
||||
left: 10,
|
||||
operator: '*',
|
||||
right: 4,
|
||||
},
|
||||
operator: '+',
|
||||
right: 2,
|
||||
}) // -> 42
|
||||
```
|
||||
|
||||
This functionality is flagged as `EXPERIMENTAL` and awaits community feedback.
|
||||
Reference in New Issue
Block a user