Skip to content
This repository was archived by the owner on Jun 10, 2025. It is now read-only.

Commit 4fa6f5a

Browse files
committed
Allow primitives in objects.
1 parent 84c88bf commit 4fa6f5a

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

src/object.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ test('object', () => {
88
test('error', () => {
99
expect(() => $.object({ foo: $.string, bar: $.number })(JSON.parse('{"foo":"a","bar":"2"}'))).toThrow('[bar] Expected number, got \'2\'.')
1010
})
11+
12+
test('primitive', () => {
13+
const assert = $.object({
14+
foo: 'FOO' as const,
15+
bar: 1 as const,
16+
baz: true as const
17+
})
18+
expect(() => assert({ foo: 'FOO', bar: 1, baz: true, xyz: 'yes' })).not.toThrow()
19+
expect(() => assert({ foo: 1 })).toThrow('Expected \'foo\' to be \'FOO\', got 1 in { foo: 1 } object.')
20+
})

src/object.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { inspect } from 'util'
2-
import type { Assert, Asserted } from './prelude.js'
2+
import type { Assert, Asserted, Primitive } from './prelude.js'
33

44
const object =
5-
<T extends Record<string, Assert<unknown>>>(kvs: T): Assert<{ [k in keyof T]: Asserted<T[k]> }> =>
5+
<T extends Record<string, Primitive | Assert<unknown>>>(kvs: T): Assert<{ [k in keyof T]: Asserted<T[k]> }> =>
66
value => {
77
if (typeof value !== 'object' || value === null) {
88
throw new TypeError(`Expected object, got ${inspect(value)}.`)

src/partial.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import type { Assert, Asserted } from './prelude.js'
1+
import { inspect } from 'util'
2+
import type { Assert, Asserted, Primitive } from './prelude.js'
23

34
const partial =
4-
<T extends Record<string, Assert<unknown>>>(kvs: T): Assert<{ [k in keyof T]?: Asserted<T[k]> }> =>
5+
<T extends Record<string, Primitive | Assert<unknown>>>(kvs: T): Assert<{ [k in keyof T]?: Asserted<T[k]> }> =>
56
value => {
67
if (typeof value !== 'object' || value == null) {
78
throw new TypeError('Expected object.')
@@ -10,7 +11,16 @@ const partial =
1011
if (typeof (value as Record<string, unknown>)[k] === 'undefined') {
1112
continue
1213
}
13-
kvs[k]((value as Record<string, unknown>)[k])
14+
const v = kvs[k]
15+
if (typeof v === 'function') {
16+
try {
17+
v((value as Record<string, unknown>)[k])
18+
} catch (err: unknown) {
19+
throw new TypeError(`[${k}] ${err instanceof Error ? err.message : err}`)
20+
}
21+
} else if (v !== (value as Record<string, unknown>)[k]) {
22+
throw new TypeError(`Expected ${inspect(k)} to be ${inspect(v)}, got ${inspect((value as Record<string, unknown>)[k])} in ${inspect(value)} object.`)
23+
}
1424
}
1525
return value
1626
}

src/prelude.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ export type Assert<R> =
1010
export type Asserted<A> =
1111
A extends (value: unknown) => infer U ?
1212
U :
13-
never
13+
A extends Primitive ?
14+
A :
15+
never
1416

1517
export type Awaited<T> =
1618
T extends PromiseLike<infer U> ?

0 commit comments

Comments
 (0)