export default class ArrayExtension { private readonly property: string; private readonly body: (this: Array) => any; constructor(property: string, body: (this: Array) => any) { this.property = property; this.body = body; } assign() { // eslint-disable-next-line no-extend-native Object.defineProperty(Array.prototype, this.property, { value: this.body, enumerable: false, }); } } /** * IMPORTANT: Any extension you add here *must* have a corresponding type definition * in the Array interface in ./General/ExtensionsTypings.ts. Otherwise, * Typescript will not recognize your new function. */ const extensions = [ new ArrayExtension('lastElement', function () { if (!this.length) { return undefined; } return this[this.length - 1]; }), ]; function Assign() { extensions.forEach(extension => extension.assign()); } export { Assign };