Intuition

Code

OOP

type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
type OnceFn = (...args: JSONValue[]) => JSONValue | undefined
 
function once(fn: Function): OnceFn {
    let called = false;
    return function (...args) {
        if (called) {
            return undefined;
        }
 
        called = true;
        return fn.apply(this, args);
    };
}

Without OOP

type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
type OnceFn = (...args: JSONValue[]) => JSONValue | undefined
 
function once(fn: Function): OnceFn {
    let called = false;
    return function (...args) {
        if (called) {
            return undefined;
        }
        
        called = true;
        return fn(...args);
    };
}
 
/**
 * let fn = (a,b,c) => (a + b + c)
 * let onceFn = once(fn)
 *
 * onceFn(1,2,3); // 6
 * onceFn(2,3,6); // returns undefined without calling fn
 */

References