@technobuddha/library
Version:
A large library of useful functions
66 lines • 4.37 kB
JavaScript
import { isObject } from "./is-object.js";
import { isPrimitive } from "./is-primitive.js";
/**
* Convert an object into its primitive (string, number, etc.) value
* @param input - the object
* @param hint - A "hint" as to what the type should be. "string", "number" or "default"
* @returns primitive value
* @group Object
* @category Conversion
* @example
* ```typescript
* toPrimitive(42); // 42
* toPrimitive('hello'); // 'hello'
* toPrimitive(new Number(42)); // 42
* toPrimitive(new String('abc')); // 'abc'
* toPrimitive({ valueOf() { return 7; } }); // 7
* toPrimitive({ toString() { return 'x'; } }, 'string'); // 'x'
* ```
*/
export function toPrimitive(input, hint = 'default') {
let wrapper = input;
if (isPrimitive(input)) {
if (input == null) {
return input;
}
if (typeof input === 'string') {
wrapper = String.prototype;
}
else if (typeof input === 'number') {
wrapper = Number.prototype;
}
else if (typeof input === 'bigint') {
wrapper = BigInt.prototype;
}
else if (typeof input === 'boolean') {
wrapper = Boolean.prototype;
}
else {
wrapper = Symbol.prototype;
}
}
if (isObject(wrapper)) {
if (Symbol.toPrimitive in wrapper) {
// @ts-expect-error typescript can't figure out that the wrapper can be indexed by the symbol
return wrapper[Symbol.toPrimitive].call(input, hint);
}
else if (hint === 'string') {
if ('toString' in wrapper) {
return wrapper.toString.call(input);
}
else if ('valueOf' in wrapper) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return wrapper.valueOf.call(input);
}
}
else if ('valueOf' in wrapper) {
return wrapper.valueOf.call(input);
}
else if ('toString' in wrapper) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return wrapper.toString.call(input);
}
}
throw new TypeError('Cannot convert object to a primitive value');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tcHJpbWl0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RvLXByaW1pdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBYyxFQUNkLE9BQXdDLFNBQVM7SUFFakQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXBCLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbEMsNkZBQTZGO1lBQzdGLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLElBQUksU0FBUyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNoQyw4REFBOEQ7Z0JBQzlELE9BQVEsT0FBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNqQyw4REFBOEQ7WUFDOUQsT0FBUSxPQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsNENBQTRDLENBQUMsQ0FBQztBQUNwRSxDQUFDIn0=