object/isEntry.ts

/** @module Object */

import { isStr } from '@string/isStr'
import { isNum } from '@number/isNum'
import { isArr } from '@array/isArr'

/**
 * Checks if the input is a valid entry - a 2-element array, like what Object.entries produces.
 * Expects the first element in the entry to be either a string or a number.
 * @function
 * @example isEntry([1, 2]) // true
 * @example isEntry(["id", 87]) // true
 * @example isEntry([new Date(), 2]) // false, first element not string or number
 * @example isEntry([1, 2, 3]) // false, too many elements
 * @param {*} maybeEntry - Item to check if it's an entry
 *
 * @returns {Boolean} - True if it is an entry, false otherwise
 */
export const isEntry = <T = any, V = any>(
  maybeEntry: any
): maybeEntry is [T, V] =>
  isArr(maybeEntry) &&
  maybeEntry.length === 2 &&
  (isNum(maybeEntry[0]) || isStr(maybeEntry[0]))