object-shape-tester
Version:
Test object properties and value types.
48 lines (47 loc) • 1.66 kB
TypeScript
import { type AnyObject } from '@augment-vir/common';
import { type TPick } from '@sinclair/typebox';
import { type ShapeInitSchema, type ShapeInitType } from '../shape/shape.js';
/**
* Type helper for {@link pickShape} to ensure that the selection parameter doesn't include extra
* invalid keys.
*
* @category Internal
*/
export type EnforceSelectionKeys<OriginalKeys extends PropertyKey, Selection extends Readonly<AnyObject>> = Readonly<{
[Key in keyof Selection]: Key extends OriginalKeys ? Selection[Key] : never;
}>;
/**
* Creates a shape by picking specific keys off of another object shape.
*
* @category Shape
* @example
*
* ```ts
* import {pickShape, checkValidShape} from 'object-shape-tester';
*
* const myShape = pickShape(
* {
* hi: '',
* bye: -1,
* },
* {
* hi: true,
* },
* );
*
* checkValidShape(
* {
* hi: 'some value',
* },
* myShape,
* ); // `true`
* checkValidShape(
* {
* hi: 'some value',
* bye: 100,
* },
* myShape,
* ); // `false`
* ```
*/
export declare function pickShape<const OriginalShape extends object, const Selection extends Readonly<Partial<Record<keyof ShapeInitType<OriginalShape>, boolean>>>>(originalShape: OriginalShape, selection: Selection & EnforceSelectionKeys<keyof NoInfer<ShapeInitType<OriginalShape>>, NoInfer<Selection>>): import("../shape/shape.js").Shape<TPick<ShapeInitSchema<OriginalShape>, (keyof { [Key in keyof Selection as Selection[Key] extends true ? Key : true extends infer T ? T extends true ? T extends Selection[Key] ? Key : never : never : never]: Key; })[]>>;