export interface ObjectLike { [index: string]: T; [index: number]: T; } export function create(): ObjectLike { return Object.create(null); } export const has: (obj: ObjectLike, key: string | number | symbol) => boolean = Function.prototype.call.bind(Object.prototype.hasOwnProperty); export function assign(target: ObjectLike, ...sources: any[]) { for (let i = 0; i < sources.length; i++) { const source = sources[i]; for (const key in source) if (has(source, key)) target[key] = source[key]; } return target; } export function clear(obj: ObjectLike) { for (const key in obj) if (has(obj, key)) delete obj[key]; return obj; } export function value(obj: ObjectLike, key: string | number) { if (!has(obj, key)) throw new TypeError(`Value with key ${key} does not exists.`); return obj[key]; }