gvergnaud / hotscript
- четверг, 16 февраля 2023 г. в 00:14:30
Type-level madness
A lodash-like library for types, with support for type-level lambda functions.
// prettier-ignore
type res1 = Pipe<
// ^? 95
[1, 2, 3, 4, 3, 4],
[
Tuples.Map<Numbers.Add<3>>,
Tuples.Join<".">,
Strings.Split<".">,
Tuples.Map<Strings.ToNumber>,
Tuples.Map<Numbers.Add<10>>,
Tuples.Sum
]
>;
// This is a type-level "lambda"!
interface Duplicate extends Fn {
return: [Fn.arg0<this>, Fn.arg0<this>];
}
type result1 = Call<Tuples.Map<Duplicate>, [1, 2, 3, 4]>;
// ^? [[1, 1], [2, 2], [3, 3], [4, 4]]
type result2 = Call<Tuples.FlatMap<Duplicate>, [1, 2, 3, 4]>;
// ^? [1, 1, 2, 2, 3, 3, 4, 4]
// Let's compose some functions to transform an object type:
type ToAPIPayload<T> = Pipe<
T,
[
Objects.OmitBy<Booleans.Equals<symbol>>,
Objects.Assign<{ metadata: { newUser: true } }>,
Objects.SnakeCaseDeep,
Objects.Assign<{ id: string }>
]
>;
type T = ToAPIPayload<{
id: symbol;
firstName: string;
lastName: string;
}>;
// Returns:
type T = {
id: string;
metadata: { new_user: true };
first_name: string;
last_name: string;
};