const hasOwnProperty = (obj: Object, key: string) => Object.prototype.hasOwnProperty.call(obj, key) export default function defaults(obj: T, defaults: D, nullable = false): T & D { const merged = Object.assign({}, obj) as T & D for (const key in defaults) { let _key = key as string if (hasOwnProperty(obj, key)) { merged[_key] = nullable ? obj[_key] : (obj[_key] == null ? defaults[_key] : obj[_key]) } else { merged[_key] = defaults[_key] } } return merged }