import { $CONSTRUCTOR, MetaContext, MetaObject } from '../../MetaContext'; export const $CONSTRUCT = '$construct'; export type Construct = (...args: any) => T; export type $Construct = { [$CONSTRUCT]: Construct }; export const withConstruct = MetaContext>(MetaContextBase: TMetaContextBase) => class extends MetaContextBase { [$CONSTRUCT](type: any, ...args: any[]) { return this.resolveName(type)[$CONSTRUCT](...args) as T; } }; export function constantConstruct(value: T) { return function () { return value; }; } export function primitiveConstruct(constructor: (value?: any) => T) { return function (value?: any) { return arguments.length === 0 ? constructor() : constructor(value); }; } export function genericConstruct(this: MetaObject, ...args: any[]) { return Reflect.construct(this[$CONSTRUCTOR]!, args) as T; }