2023-01-22 01:34:57 +00:00
|
|
|
import type {Dependencies, Signature} from '../interfaces/type.js'
|
2023-08-18 17:57:30 +00:00
|
|
|
import {$$typeToString} from 'ts-macros'
|
2023-01-22 01:34:57 +00:00
|
|
|
|
|
|
|
export const square =
|
|
|
|
<T>(dep: Dependencies<'multiply', T>): Signature<'square', T> =>
|
|
|
|
z => dep.multiply(z, z)
|
2023-08-18 17:36:11 +00:00
|
|
|
// z => dep.fooBar(z, z) // fails as desired
|
2023-08-18 17:57:30 +00:00
|
|
|
// z => dep.multiply(z, 'foo') // still fails as desired
|
|
|
|
|
|
|
|
// make sure ts-macros is running
|
|
|
|
function $contains<T>(value: T, ...possible: Array<T>) {
|
|
|
|
// repetition which goes over all the elements in the "possible" array
|
|
|
|
return +["||", [possible], (item: T) => value === item];
|
|
|
|
}
|
|
|
|
|
|
|
|
const searchItem = "needle";
|
|
|
|
console.log("In generic arithmetic")
|
|
|
|
console.log($contains!(searchItem, "erwin", "tj"));
|
|
|
|
// Transpiles to: console.log(false);
|
|
|
|
|
|
|
|
// OK, record the type of square:
|
|
|
|
square.reflectedType = $$typeToString!<typeof square>();
|
2023-08-18 22:00:21 +00:00
|
|
|
|
2023-08-19 03:29:24 +00:00
|
|
|
type ShallowExpand<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;
|
|
|
|
type ExpandedParameters<T extends (...args: any) => any> = {[Index in keyof Parameters<T>]: ShallowExpand<Parameters<T>[Index]>}
|
|
|
|
type ExpandTwice<T extends any[]> = {[Index in keyof T] : ShallowExpand<T[Index]>}
|
|
|
|
type AsArray<T> = T extends any[] ? T : [];
|
|
|
|
type DeepExpand<T> =
|
|
|
|
T extends (...args: any) => any ? (...pars: AsArray<DeepExpand<Parameters<T>>>) => DeepExpand<ReturnType<T>> :
|
|
|
|
T extends unknown ? { [K in keyof T]: DeepExpand<T[K]> } : never;
|
|
|
|
type Out<T> = ShallowExpand<Dependencies<'multiply', T>>;
|
2023-08-18 22:00:21 +00:00
|
|
|
|
2023-08-19 03:29:24 +00:00
|
|
|
console.log("Deps type is", $$typeToString!<<T>() => Out<T>>())
|
|
|
|
|
|
|
|
type OutB = ExpandTwice<Parameters<typeof square>>;
|
|
|
|
|
|
|
|
console.log("Or perhaps", $$typeToString!<OutB>())
|
|
|
|
|
|
|
|
console.log("Or maybe even", $$typeToString!<
|
|
|
|
<T>(...args: DeepExpand<Parameters<typeof square<T>>>) => DeepExpand<ReturnType<typeof square<T>>>
|
|
|
|
>())
|