UNPKG

proxy-extend

Version:

Transparently extend a JS object with additional properties (using ES6 Proxy)

50 lines (35 loc) 1.42 kB
import { Object as ObjectTB } from 'ts-toolbelt'; // The type of values that can be proxied export type Proxyable = null | string | number | object; // The external interface for a given proxyable value export type ProxyableExternal<T extends Proxyable> = T extends null ? {} : T extends string ? String & { toJSON : () => string } : T extends number ? Number & { toJSON : () => number } : T; export type Extension = object; export declare const proxyKey : unique symbol; export type Proxied<V extends Proxyable, E extends Extension = {}> = ObjectTB.Merge< Readonly<ObjectTB.Merge< { [proxyKey] : Readonly<{ value : V, extension : Readonly<E> }>, // [Symbol.iterator] : ..., }, E >>, ProxyableExternal<V> >; export declare const isProxyable : (value : unknown) => value is Proxyable; export declare const isProxy : (value : unknown) => boolean; export declare const unwrapProxy : <V extends Proxyable, E extends Extension>(proxy : Proxied<V, E>) => { value : V, extension : E, }; export declare const extend : (<V extends Proxyable, E extends Extension = {}>(value : V, extension ?: E) => Proxied<V, E>) & { is : typeof isProxy, unwrap : typeof unwrapProxy, }; export declare const registerProxyFormatter : () => void; export default extend;