import { Primitive } from "joshkaposh-iterator" import { is_primitive } from "joshkaposh-iterator/src/util" export type Class = new (...args: Args) => Inst type NativeClass = Array | Set | Map | WeakSet | WeakMap type NativeContructor = ArrayConstructor | SetConstructor | MapConstructor | WeakSetConstructor | WeakMapConstructor export type DefaultImpl = T & { default(): InstanceType } export type DefaultTrait = T extends Primitive ? T : T extends NativeContructor ? T : DefaultImpl export type Default = DefaultTrait type DefaultType = T extends Primitive ? T : T extends NativeContructor ? NativeClass : T extends DefaultImpl ? T['default'] : never; const cases = Object.freeze({ string() { return '' }, number() { return 0 }, boolean() { return false }, undefined(): undefined { }, null(): null { return null }, object(ty: DefaultImpl): object & {} { return ty.default() }, function() { }, }) function is_native_ctor(ty: unknown): ty is NativeContructor { return ty === Set || ty === Map || ty === WeakMap || ty === WeakSet } // @ts-expect-error export function create_default(value: T): DefaultType { if (is_primitive(value)) { // @ts-expect-error; return cases[`${String(value)}`]() } if (is_native_ctor(value)) { // @ts-expect-error return new value() } if (value && 'default' in value) { // @ts-expect-error return value.default() } }