rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
44 lines (40 loc) • 1.28 kB
TypeScript
import type { Args, GenericFn, GenericResolver } from "../HKT";
import type { Eq, IsPropertyKeyLiteral } from "../helpers";
/**
* Pick properties from an object.
*
* Sig: `<K extends keyof O, O>(k: K, o: O) => object`
*/
type Pick_<K extends keyof O, O> = Pick<O, K>;
export type { Pick_ as Pick };
interface Resolver extends GenericResolver<[PropertyKey, object], object> {
on1_: ([k]: Args<this>) => [
[{ readonly [P in typeof k]: any }],
{ readonly [P in typeof k]: unknown },
];
on_1: ([, o]: Args<this>) => [[keyof typeof o], object];
on11: ([k, o]: Args<this>) => [
[],
IsPropertyKeyLiteral<typeof k> extends true ?
{ [P in keyof typeof o as P extends typeof k ? P : never]: (typeof o)[P] } extends infer R ?
Eq<R, typeof o> extends true ?
typeof o
: R
: never
: { readonly [P in typeof k]: (typeof o)[keyof typeof o] } extends infer R ?
Eq<R, typeof o> extends true ?
typeof o
: R
: never,
];
}
/**
* [Fn] Pick properties from an object.
*
* Sig: `<K extends keyof O, O>(k: K, o: O) => object`
*/
export default interface PickFn extends GenericFn<Resolver> {
def: ([k, o]: Args<this>) => {
[P in keyof typeof o as P extends typeof k ? P : never]: (typeof o)[P];
};
}