---
name: bilal140202/lodash-es-runtime-guards
source: https://app.decimal.ai/s/bilal140202-lodash-es-runtime-guards@1/SKILL.md
source_sha256: ba72a2633a79
---

# lodash-es-runtime-guards

Replace runtime `typeof` checks and ad-hoc empty-string checks with `lodash-es` predicates.

## When to Use

- You see runtime checks like `typeof value === 'string'`.
- You see object guards like `value && typeof value === 'object'`.
- You see emptiness checks like `value.trim() !== ''` or `value.trim() === ''`.
- You want consistent guard style across app, server, IPC, and tests.

## Do Not Replace

- Type-level `typeof` (TypeScript only), for example:
  - `ReturnType<typeof fn>`
  - `keyof typeof CONST_MAP`
  - `z.infer<typeof Schema>`

These are compile-time types and must remain as-is.

## Guard Mapping

- `typeof x === 'string'` -> `isString(x)`
- `typeof x !== 'string'` -> `!isString(x)`
- `typeof x === 'number'` -> `isNumber(x)`
- `typeof x === 'boolean'` -> `isBoolean(x)`
- `typeof x === 'function'` -> `isFunction(x)`
- `typeof x === 'undefined'` -> `isUndefined(x)`
- `x && typeof x === 'object'` -> `isObjectLike(x)`
- `typeof x === 'object' && x !== null` -> `isObjectLike(x)`
- `typeof x === 'object' && !Array.isArray(x)` -> `isObjectLike(x) && !isArray(x)`

## String Emptiness Pattern

- Prefer:
  - `isEmpty(value.trim())`
- Instead of:
  - `value.trim() === ''`
  - `value.trim() !== ''`
  - `value.trim().length === 0`

## Import Style

- Use named imports from `lodash-es`:

```ts
import { isString, isNumber, isObjectLike, isEmpty } from 'lodash-es';
```

- Do not use full-package imports.
- Reuse existing imports in file; avoid duplicate imports.

## Refactor Checklist

1. Replace runtime checks first, preserving behavior.
2. Keep array/object branching semantics unchanged.
3. Re-scan:

```bash
rg -n "typeof\s+[^\n]+(?:===|!==)\s*'" src
```

4. Confirm only type-level `typeof` remains:

```bash
rg -n "\btypeof\b" src
```

5. Run verification:

```bash
npm run type-check
```