Skip to content

Commit

Permalink
Revision 0.29.2 (#486)
Browse files Browse the repository at this point in the history
  • Loading branch information
sinclairzx81 authored Jul 3, 2023
1 parent 1504082 commit c8d8a70
Show file tree
Hide file tree
Showing 15 changed files with 494 additions and 1,383 deletions.
141 changes: 141 additions & 0 deletions changelog/0.29.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
## [0.29.2](https://www.npmjs.com/package/@sinclair/typebox/v/0.29.2)

## Overview

Revision 0.29.2 includes enhancements to `Type.Index`

This revision contains no breaking changes

## Contents

- Enhancements
- [Modifier Index Resolver](#Modifier-Index-Resolver)
- [Indexed Intersect](#Indexed-Intersect)
- [Indexed Union](#Indexed-Union)
- [Composite](#Composite)

<a name="Modifier-Index-Resolver"></a>

## Modifier Index Resolver

Revision 0.29.2 re-introduces optional property narrowing for Indexed Access Types. This functionality is specific when indexing overlapping properties with one or more optional modifiers. Revision 0.28.0 attempted to implement this narrowing, however was pulled due to instantiation issues raised on issue [419](https://github.com/sinclairzx81/typebox/issues/419) (specific to composite narrowing)

Revision 0.29.2 attempts to re-introduce this functionality using a different resolution strategy. It uses Indexed Access Types as the construct in which to apply such narrowing and expands upon Union and Intersection type normalization for optional modifier unwrap and remapping. This approach unifies Composite inference with Index Access Types and makes provisions for a possible `Type.Mapped` feature in later releases.

<a name="Indexed-Intersect"></a>

## Indexed Intersect

The following are the index resolver cases for intersect types.

### Case 1
```typescript
const T = Type.Intersect([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Optional(Type.Number()) })
])

const I = Type.Index(T, ['x'])

// type I = TOptional<TUnion<[TNumber, TNumber]>>
```
### Case 2
```typescript
const T = Type.Intersect([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Number() })
])

const I = Type.Index(T, ['x'])

// type I = TUnion<[TNumber, TNumber]>
```
### Case 3
```typescript
const T = Type.Intersect([
Type.Object({ x: Type.Number() }),
Type.Object({ x: Type.Number() })
])

const I = Type.Index(T, ['x'])

// type I = TUnion<[TNumber, TNumber]>
```
<a name="Indexed-Union"></a>

## Indexed Union

The following are the index resolver cases for union types.

### Case 1
```typescript
const T = Type.Union([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Optional(Type.Number()) })
])

const I = Type.Index(T, ['x'])

// type I = TOptional<TUnion<[TNumber, TNumber]>>
```
### Case 2
```typescript
const T = Type.Union([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Number() })
])

const I = Type.Index(T, ['x'])

// type I = TOptional<TUnion<[TNumber, TNumber]>>
```
### Case 3
```typescript
const T = Type.Union([
Type.Object({ x: Type.Number() }),
Type.Object({ x: Type.Number() })
])

const I = Type.Index(T, ['x'])

// type I = TUnion<[TNumber, TNumber]>
```
<a name="Composite"></a>

## Composite

The following are the resolver cases for indexed types when applied to composite intersection.

### Case 1
```typescript
const T = Type.Composite([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Optional(Type.Number()) })
])

// type T = TObject<{
// x: TOptional<TUnion<[TNumber, TNumber]>>
// }>
```
### Case 2
```typescript
const T = Type.Composite([
Type.Object({ x: Type.Optional(Type.Number()) }),
Type.Object({ x: Type.Number() })
])

// type T = TObject<{
// x: TUnion<[TNumber, TNumber]>
// }>
```
### Case 3
```typescript
const T = Type.Composite([
Type.Object({ x: Type.Number() }),
Type.Object({ x: Type.Number() })
])

// type T = TObject<{
// x: TUnion<[TNumber, TNumber]>
// }>
```
63 changes: 0 additions & 63 deletions example/codegen/formatter.ts

This file was deleted.

32 changes: 0 additions & 32 deletions example/codegen/index.ts

This file was deleted.

4 changes: 0 additions & 4 deletions example/codegen/tsconfig.json

This file was deleted.

Loading

0 comments on commit c8d8a70

Please sign in to comment.