Skip to content

Commit 2e2ad54

Browse files
committed
[schema] implement s.record
1 parent 7902038 commit 2e2ad54

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

schema.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,40 @@ export class $Object extends $Schema {
221221
*/
222222
export const object = def => new $Object(def)
223223

224+
/**
225+
* @template {$Schema<string|number|symbol>} Keys
226+
* @template {$Schema<any>} Values
227+
* @extends {$Schema<Record<Keys extends $Schema<infer K> ? K : never,Values extends $Schema<infer T> ? T : never>>}
228+
*/
229+
export class $Record extends $Schema {
230+
/**
231+
* @param {Keys} keys
232+
* @param {Values} values
233+
*/
234+
constructor (keys, values) {
235+
super()
236+
this.keys = keys
237+
this.values = values
238+
}
239+
240+
/**
241+
* @param {any} o
242+
* @return {o is Record<Keys extends $Schema<infer K> ? K : never,Values extends $Schema<infer T> ? T : never>}
243+
*/
244+
check (o) {
245+
return o != null && obj.every(o, (vv, vk) => this.keys.check(vk) && this.values.check(vv))
246+
}
247+
}
248+
249+
/**
250+
* @template {$Schema<string|number|symbol>} Keys
251+
* @template {$Schema<any>} Values
252+
* @param {Keys} keys
253+
* @param {Values} values
254+
* @return {CastToSchema<$Record<Keys,Values>>}
255+
*/
256+
export const record = (keys, values) => new $Record(keys, values)
257+
224258
/**
225259
* @template {$Schema<any>[]} S
226260
* @extends {$Schema<{ [Key in keyof S]: S[Key] extends $Schema<infer Type> ? Type : never }>}

schema.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ export const testSchemas = _tc => {
5959
// @ts-expect-error
6060
t.assert(!myobject.validate(new Date()))
6161
})
62+
t.group('record', () => {
63+
const myrecord = s.record(s.number, s.string)
64+
// @ts-expect-error
65+
t.assert(!myrecord.validate({ a: 'a' }))
66+
const myrecord2 = s.record(s.string, s.number)
67+
const o = { a: 42 }
68+
t.assert(myrecord2.validate(o))
69+
})
6270
t.group('tuple', () => {
6371
const mytuple = s.tuple(s.number, s.string)
6472
t.assert(mytuple.validate([4, '5']))

test.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
"lib0/performance.js": "./performance.js",
155155
"lib0/dist/performance.cjs": "./dist/performance.node.cjs",
156156
"lib0/performance": "./performance.js",
157+
"lib0/schema": "./schema.js",
157158
"isomorphic.js": "./node_modules/isomorphic.js/browser.mjs",
158159
"isomorphic.js/package.json": "./node_modules/isomorphic.js/package.json"
159160
},

0 commit comments

Comments
 (0)