Revision 0.34.46 (#4)

* Functions Must Support TObject as Generic Constraint

* ChangeLog

* Version
This commit is contained in:
sinclairzx81
2026-01-02 02:49:02 +09:00
committed by GitHub
parent 096e1f4a8b
commit 72d13e1bc4
6 changed files with 137 additions and 26 deletions

View File

@@ -68,3 +68,29 @@ export function Expect<T extends TSchema>(schema: T) {
ToStaticEncode() {},
} as ExpectResult<T>
}
// ------------------------------------------------------------------
// IsNeverExtends
// ------------------------------------------------------------------
/** Special case for left-side `never` as given by `(never extends T ? true : false)` */
export function IsExtendsWhenLeftIsNever<Left extends unknown, Right extends unknown>(_expect: [TExtendsExpect<Left, Right>] extends [true] ? true : false) {}
// ------------------------------------------------------------------
// IsExtends
// ------------------------------------------------------------------
type TExtendsExpect<Left extends unknown, Right extends unknown> = Left extends Right ? true : false
export function IsExtends<Left extends unknown, Right extends unknown>(_expect: TExtendsExpect<Left, Right>) {}
// ------------------------------------------------------------------
// IsExtendsMutual
// ------------------------------------------------------------------
type TExtendsMutualExpect<Left extends unknown, Right extends unknown> = (<T>() => T extends Left ? 1 : 2) extends <T>() => T extends Right ? 1 : 2 ? true : false
export function IsExtendsMutual<Left extends unknown, Right extends unknown>(_expect: TExtendsMutualExpect<Left, Right>) {}
// ------------------------------------------------------------------
// IsExtendsNever
// ------------------------------------------------------------------
type TExtendsNever<Type extends unknown> = [Type] extends [never] ? true : false
export function IsExtendsNever<Type extends unknown>(_expect: TExtendsNever<Type>) {}

View File

@@ -1,6 +1,5 @@
import { Expect } from './assert'
import { Type } from '@sinclair/typebox'
import { Expect, IsExtendsMutual } from './assert'
import { Type, type TObject, type Static, type TNumber } from '@sinclair/typebox'
{
const T = Type.Object({
A: Type.String(),
@@ -68,3 +67,65 @@ import { Type } from '@sinclair/typebox'
C: number
}>()
}
// ------------------------------------------------------------------
// Required
// ------------------------------------------------------------------
{
const _A = Type.Object({})
const _B = Type.Object({ x: Type.Number() })
const _C = Type.Object({ x: Type.Number(), y: Type.Number() })
type A = (typeof _A)['required']
type B = (typeof _B)['required']
type C = (typeof _C)['required']
IsExtendsMutual<A, string[] | undefined>(true)
IsExtendsMutual<B, ['x']>(true)
IsExtendsMutual<C, ['x', 'y']>(true)
}
// ------------------------------------------------------------------
// https://github.com/sinclairzx81/typebox/issues/1500
// ------------------------------------------------------------------
{
function test<Type extends TObject>(type: Type): Static<Type> {
return null as never
}
const _A = test(Type.Object({}))
const _B = test(
Type.Object({
x: Type.Number(),
y: Type.Number(),
}),
)
const _C = test(
Type.Partial(
Type.Object({
x: Type.Number(),
y: Type.Number(),
}),
),
)
}
// ------------------------------------------------------------------
// Inference
// ------------------------------------------------------------------
{
type T = Static<typeof T>
const T = null as never as TObject<{}>
Expect(T).ToStatic<{}>()
}
{
type T = Static<typeof T>
const T = null as never as TObject
Expect(T).ToStatic<{
[x: string]: unknown
[x: number]: unknown
}>()
}
{
type T = Static<typeof T>
const T = null as never as TObject<{ x: TNumber }>
Expect(T).ToStatic<{
x: number
}>()
}