telefunc
Version:
Remote functions. Instead of API.
42 lines (41 loc) • 1.87 kB
JavaScript
export { hasProp };
import { isCallable } from './isCallable.js';
// prettier-ignore
// biome-ignore format:
function hasProp(obj, prop, type = 'unknown') {
const propExists = typeof obj === 'object' && obj !== null && prop in obj;
if (!propExists) {
return false;
}
if (type === 'unknown') {
return true;
}
const propValue = obj[prop];
if (type === 'array') {
return Array.isArray(propValue);
}
if (type === 'string[]') {
return Array.isArray(propValue) && propValue.every((el) => typeof el === 'string');
}
if (type === 'function') {
return isCallable(propValue);
}
if (Array.isArray(type)) {
return typeof propValue === 'string' && type.includes(propValue);
}
if (type === 'null') {
return propValue === null;
}
if (type === 'true') {
return propValue === true;
}
return typeof propValue === type;
}
/* Couldn't make it work
function propsIsNotNullish<ObjectType extends Record<PropName, PropType | null | undefined>, PropName extends PropertyKey, PropType>(obj: ObjectType, prop: PropName): obj is ObjectType & Record<PropName, PropType> {
return obj[prop] !== null && obj[prop] !== undefined
}
*/
// Resources:
// - https://2ality.com/2020/06/type-guards-assertion-functions-typescript.html
// - https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABDAzgFQJ4AcCmdgAUAbgIYA2IOAXIiWBgDSJTbWIDkARnHGTnewCUNUhRzIUibr35gA3AFgAUKEiwEEzLnzFylGnUbNWNdmBABbTjgBOQkXvGpE5q7cUrw0eElRa8hKL6tPRMLLimKFA2MGAA5vaIQU6SUTHxHqreGn6sOskGocYRHOAA1mBwAO5gickSiOWVNZle6r7oeYGOhUbhbGmxcYgAvKVgFdW1wlI8fHSIAN7KiMiExeIjW+OTNeyIgksrq4g2OFAgNkjRlMcAvsdnF1cb+EmOo9v9Hg9KyhAIKK0GhNKajRAAFgATMplCQUChbFACLltIQSEwzJZrHZBIJ-oCZAA6MhwOIEEj4v6eNQ+WgIpEEAFgAAmMHaIImzTAM3hiJsUEkzLZ7SOShOa0QTIQIp8hyelzAx1WUAAFjZqi4cFVEABRGwamwEdgAQQZArpADESDAyEJlHcgA