diff --git a/packages/validator/src/types/primitive.bigint.ts b/packages/validator/src/types/primitive.bigint.ts index 3a2948d..1a950e3 100644 --- a/packages/validator/src/types/primitive.bigint.ts +++ b/packages/validator/src/types/primitive.bigint.ts @@ -1,4 +1,4 @@ -import type { IsEqual, IsWhat, OnlySubType, t as tn } from '@typp/core' +import type { IsEqual, IsSubType, IsTrue, IsWhat, Not, OnlySubType, t as tn } from '@typp/core' import { FALSY } from '../base' import type { SwitchBaseType } from '../base.inner' @@ -27,22 +27,28 @@ declare module '@typp/core' { ) : never boolean: InputRest extends true ? 1n : InputRest extends false ? 0n : never - // TODO `${Input}n` extends `${O extends bigint}` ? O : never - number: bigint + number: `${InputRest & number}` extends `${infer O extends bigint}` ? O : never string: InputRest extends ( - | `${bigint}${string}` + | `${infer O extends bigint}${string}` | `0${'b' | 'B'}${string}` | `0${'o' | 'O'}${number}` | `0${'x' | 'X'}${string}` - ) ? bigint - : true extends IsEqual + ) ? ( + Not> extends true + ? O + : bigint + ) : true extends IsEqual ? unknown : never symbol: never null: 0n undefined: 0n - }> + }> extends infer Result ? ( + IsWhat extends true ? Result : ( + IsTrue> extends true ? Result : never + ) + ) : never ] } } diff --git a/packages/validator/tests/types/literal.spec.ts b/packages/validator/tests/types/literal.spec.ts index 06a87cd..ed393bc 100644 --- a/packages/validator/tests/types/literal.spec.ts +++ b/packages/validator/tests/types/literal.spec.ts @@ -194,4 +194,28 @@ describe('literal primitive', () => { }).toThrow() }) }) + describe('transform', () => { + test('bigint', () => { + const zeroBigIntSkm = t.const(0n) + const r0 = zeroBigIntSkm.parse(0n) + expect(r0).toBe(0n) + expectTypeOf(r0).toEqualTypeOf<0n>() + + const r1 = zeroBigIntSkm.parse.narrow(0) + expect(r1).toBe(0n) + expectTypeOf(r1).toEqualTypeOf<0n>() + + const r2 = zeroBigIntSkm.parse.narrow('0') + expect(r2).toBe(0n) + expectTypeOf(r2).toEqualTypeOf<0n>() + expect(() => { + const r0 = zeroBigIntSkm.parse(1) + expectTypeOf(r0).toEqualTypeOf() + }).toThrow() + expect(() => { + const r0 = zeroBigIntSkm.parse('1') + expectTypeOf(r0).toEqualTypeOf() + }).toThrow() + }) + }) })