| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- export const CallableInstance =
- /**
- * @type {new <Parameters extends Array<unknown>, Result>(property: string | symbol) => (...parameters: Parameters) => Result}
- */
- (
- /** @type {unknown} */
- (
- /**
- * @this {Function}
- * @param {string | symbol} property
- * @returns {(...parameters: Array<unknown>) => unknown}
- */
- function (property) {
- const self = this
- const constr = self.constructor
- const proto = /** @type {Record<string | symbol, Function>} */ (
- // Prototypes do exist.
- // type-coverage:ignore-next-line
- constr.prototype
- )
- const value = proto[property]
- /** @type {(...parameters: Array<unknown>) => unknown} */
- const apply = function () {
- return value.apply(apply, arguments)
- }
- Object.setPrototypeOf(apply, proto)
- // Not needed for us in `unified`: we only call this on the `copy`
- // function,
- // and we don't need to add its fields (`length`, `name`)
- // over.
- // See also: GH-246.
- // const names = Object.getOwnPropertyNames(value)
- //
- // for (const p of names) {
- // const descriptor = Object.getOwnPropertyDescriptor(value, p)
- // if (descriptor) Object.defineProperty(apply, p, descriptor)
- // }
- return apply
- }
- )
- )
|