{"id":26779199,"url":"https://github.com/nberlette/is","last_synced_at":"2026-04-11T06:05:16.573Z","repository":{"id":285015114,"uuid":"952401282","full_name":"nberlette/is","owner":"nberlette","description":"Just another portable platform-agnostic package of high-performance type predicates. 🤪","archived":false,"fork":false,"pushed_at":"2025-03-28T22:46:03.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T23:28:46.407Z","etag":null,"topics":["assertions","bun","deno","guards","js","jsr","library","narrowing","node","predicates","ts","type-guards","type-safe","typechecks","typescript","universal","utilities"],"latest_commit_sha":null,"homepage":"https://jsr.io/@nick/is","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nberlette.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"ko_fi":"nberlette"}},"created_at":"2025-03-21T08:12:58.000Z","updated_at":"2025-03-28T22:45:54.000Z","dependencies_parsed_at":"2025-03-28T23:39:31.649Z","dependency_job_id":null,"html_url":"https://github.com/nberlette/is","commit_stats":null,"previous_names":["nberlette/is"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nberlette%2Fis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nberlette%2Fis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nberlette%2Fis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nberlette%2Fis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nberlette","download_url":"https://codeload.github.com/nberlette/is/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246145085,"owners_count":20730495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assertions","bun","deno","guards","js","jsr","library","narrowing","node","predicates","ts","type-guards","type-safe","typechecks","typescript","universal","utilities"],"created_at":"2025-03-29T06:15:13.728Z","updated_at":"2025-12-30T23:19:46.017Z","avatar_url":"https://github.com/nberlette.png","language":"TypeScript","funding_links":["https://ko-fi.com/nberlette"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# [@nick/is][GitHub]\n\n\u003cbig\u003e\u003cb\u003e160+ type guards, designed for all modern JS runtimes.\u003c/b\u003e\u003c/big\u003e\n\n[![][badge-jsr]][JSR] [![][badge-issues] ![][badge-issues-pull]][GitHub]\n\n\u003c/div\u003e\n\n---\n\nYup, it's another type guard library. This one is designed with a focus on\ntype-safety, portability, and performance, and is built to work on any modern\nES2015+ runtime.\n\n\u003e [!NOTE]\n\u003e\n\u003e Unless otherwise noted, all type guards are built to work in Deno, Node, Bun,\n\u003e Cloudflare Workers, and even in web browsers. If you find a type guard that\n\u003e doesn't work in a specific environment, please [open an issue][GitHub] and\n\u003e I'll address it as soon as possible. Thanks!\n\n## Install\n\nThis package is primarily distributed on [JSR]. If you're running Deno 2.x, it's\nbuilt right in!\n\n```sh\ndeno add jsr:@nick/is\n```\n\n### Node-style Package Managers\n\nYou can also install `@nick/is` right into any Node codebase using the `jsr`\nCLI, either via `npx` or an equivalent from your package manager of choice:\n\n#### Bun\n\n```sh\nbunx jsr add @nick/is\n```\n\n\u003e The `--bun` flag can be added to specifically instruct JSR to use Bun.\n\n#### PNPM\n\n```sh\npnpm dlx jsr add @nick/is\n```\n\n\u003e The `--pnpm` flag can be added to specifically instruct JSR to use PNPM.\n\n#### Yarn\n\n```sh\nyarn dlx jsr add @nick/is\n```\n\n\u003e The `--yarn` flag can be added to specifically instruct JSR to use Yarn.\n\n#### NPM\n\n```sh\nnpx jsr add @nick/is\n```\n\n---\n\n## Usage\n\nThe recommended way to use the functions in this library is to import them on an\nas-needed basis, directly from their respective submodules.\n\n\u003e **[See the API documentation]** for a complete list of available type guards.\n\n[See the API documentation]: https://jsr.io/@nick/is/-/doc \"View the API documentation on JSR\"\n\n```ts\nimport { isString } from \"@nick/is/string\";\n\nimport { isNumber } from \"@nick/is/number\";\n\nimport { isFiniteInteger } from \"@nick/is/finite-integer\";\n// this is ^ also available via \"@nick/is/finite/integer\"\n```\n\n### Everything, All at Once\n\nThe `@nick/is` project also exposes **all** of its type guards as named exports\nfrom the root module, allowing you to import everything at once.\n\n#### Individual Named Imports\n\n```ts\nimport { isNumber, isString } from \"@nick/is\";\n\nconsole.assert(isString(\"@nick/is\")); // OK\nconsole.assert(isNumber(0)); // OK\n```\n\n#### Explicit Functions (instead of the `is` namespace)\n\nInstead of importing the default or namespace export, import only the functions\nyou need:\n\n```ts\nimport { isString } from \"@nick/is\";\nconsole.assert(isString(\"@nick/is\")); // OK\n```\n\nOr for multiple functions:\n\n```ts\nimport { isNumber } from \"@nick/is\";\nconsole.assert(isNumber(0)); // OK\n```\n\n\u003e Once you've determined which type guards your codebase actually needs, it's\n\u003e recommended to migrate to named imports for production. This unlocks bundler\n\u003e tree-shaking, quicker build times, and a smaller final bundle size.\n\n---\n\n## Type Guards\n\n### Primitives\n\n#### `isNull`\n\nChecks if a given value is `null`.\n\n```ts\nimport { isNull } from \"@nick/is\";\n\nisNull(null); // true\nisNull(undefined); // false\n```\n\n\u003e **Aliases**: `is.null`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isNull)\n\n#### `isUndefined`\n\nChecks if a given value is `undefined`.\n\n```ts\nimport { isUndefined } from \"@nick/is\";\n\nisUndefined(undefined); // true\nisUndefined(null); // false\n```\n\n\u003e **Aliases**: `is.undefined`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isUndefined)\n\n#### `isMissing`\n\nChecks if a given value is `null` or `undefined`.\n\n```ts\nimport { isMissing } from \"@nick/is\";\n\nisMissing(null); // true\nisMissing(undefined); // true\nisMissing(0); // false\n```\n\n\u003e **Aliases**: `is.nullish` / `is.missing`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isMissing)\n\n#### `isDefined`\n\nChecks if a given value is **_not_** `undefined`.\n\n```ts\nimport { isDefined } from \"@nick/is\";\n\nisDefined(0); // true\nisDefined(undefined); // false\n```\n\n\u003e **Aliases**: `is.defined`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isDefined)\n\n#### `isString`\n\nChecks if a given value is a `string`.\n\n```ts\nimport { isString } from \"@nick/is\";\n\nisString(\"hello\"); // true\nisString(0); // false\n```\n\n\u003e **Aliases**: `is.string`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isString)\n\n#### `isNumber`\n\nChecks if a given value is a `number`.\n\n```ts\nimport { isNumber } from \"@nick/is\";\n\nisNumber(0); // true\nisNumber(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.number`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isNumber)\n\n#### `isSymbol`\n\nChecks if a given value is a `symbol`.\n\n```ts\nimport { isSymbol } from \"@nick/is\";\n\nisSymbol(Symbol()); // true\nisSymbol(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.symbol`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isSymbol)\n\n#### `isBigInt`\n\nChecks if a given value is a `bigint`.\n\n```ts\nimport { isBigInt } from \"@nick/is\";\n\nisBigInt(BigInt(0)); // true\nisBigInt(0); // false\n```\n\n\u003e **Aliases**: `is.bigint`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isBigInt)\n\n#### `isBoolean`\n\nChecks if a given value is a `boolean`.\n\n```ts\nimport { isBoolean } from \"@nick/is\";\n\nisBoolean(true); // true\nisBoolean(0); // false\n```\n\n\u003e **Aliases**: `is.boolean`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isBoolean)\n\n#### `isPropertyKey`\n\nChecks if a given value is a valid property key, meaning it is either a `string`\nor a `symbol`.\n\n```ts\nimport { isPropertyKey } from \"@nick/is;\n\nisPropertyKey(\"hello\"); // true\nisPropertyKey(Symbol()); // true\nisPropertyKey(0); // false\n```\n\n\u003e **Aliases**: `is.propertyKey`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isPropertyKey)\n\n#### `isIdentifier`\n\nChecks if a given value is a valid ECMAScript identifier, meaning it is a\n`string` that is not a reserved word and is a valid identifier name.\n\n```ts\nimport { isIdentifier } from \"@nick/is\";\n\nisIdentifier(\"hello\"); // true\nisIdentifier(\"if\"); // false\n```\n\n\u003e **Aliases**: `is.identifier`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isIdentifier)\n\n---\n\n### Objects\n\n#### `isObject`\n\nChecks if a given value is an `object`.\n\n```ts\nimport { isObject } from \"@nick/is\";\n\nisObject({}); // true\nisObject([]); // true\nisObject(() =\u003e {}); // false\nisObject(null); // false\n```\n\n\u003e **Aliases**: `is.object`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isObject)\n\n#### `isPlainObject`\n\nChecks if a given value is a plain object, meaning it is an object that was\ncreated with the `Object` constructor or a literal object.\n\n```ts\nimport { isPlainObject } from \"@nick/is\";\n\nisPlainObject({}); // true\nisPlainObject(Object.create(null)); // true\nisPlainObject(new Map()); // false\n```\n\n\u003e **Aliases**: `is.plainObject`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isPlainObject)\n\n#### `isObjectLike`\n\nChecks if a given value is object-like, meaning it is not `null` and is not a\nprimitive value.\n\n```ts\nimport { isObjectLike } from \"@nick/is\";\n\nisObjectLike({}); // true\nisObjectLike([]); // true\nisObjectLike(() =\u003e {}); // true\nisObjectLike(null); // false\n```\n\n\u003e **Aliases**: `is.objectLike`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isObjectLike)\n\n#### `isFunction`\n\nChecks if a given value is a `function`.\n\n```ts\nimport { isFunction } from \"@nick/is\";\n\nisFunction(() =\u003e {}); // true\nisFunction(0); // false\n```\n\n\u003e **Aliases**: `is.function`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isFunction)\n\n---\n\n### Async/Await\n\n#### `isPromise`\n\nChecks if a given value is a `Promise` object.\n\n```ts\nimport { isPromise } from \"@nick/is\";\n\nconst promise = new Promise(() =\u003e {});\nisPromise(promise); // true\nisPromise(0); // false\n```\n\n\u003e **Aliases**: `is.promise`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isPromise)\n\n#### `isPromiseLike`\n\nChecks if a given value is a thenable, meaning it has a `then` method.\n\n```ts\nimport { isPromiseLike } from \"@nick/is\";\n\nconst promise = { then() {} };\nisPromiseLike(promise); // true\nisPromiseLike(0); // false\n```\n\n\u003e **Aliases**: `is.promiseLike`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isPromiseLike)\n\n---\n\n### Indexed Collections\n\n#### `isArray`\n\nChecks if a given value is an array.\n\n```ts\nimport { isArray } from \"@nick/is\";\n\nisArray([]); // true\nisArray({}); // false\n```\n\n\u003e **Aliases**: `is.array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArray)\n\n#### `isArrayLike`\n\nChecks if a given value is array-like, meaning it has a `length` property and\nits elements can be accessed using integer indices.\n\n```ts\nimport { isArrayLike } from \"@nick/is\";\n\nisArrayLike([]); // true\nisArrayLike(\"hello\"); // true\nisArrayLike({}); // false\n```\n\n\u003e **Aliases**: `is.arrayLike`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayLike)\n\n#### `isArrayLikeObject`\n\nChecks if a given value is an array-like object, meaning it is an object with a\n`length` property and its elements can be accessed using integer indices.\n\n```ts\nimport { isArrayLikeObject } from \"@nick/is\";\n\nisArrayLikeObject([]); // true\nisArrayLikeObject(\"hello\"); // false\nisArrayLikeObject({}); // false\n```\n\n\u003e **Aliases**: `is.arrayLikeObject`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayLikeObject)\n\n---\n\n### Keyed Collections\n\n#### `isMap`\n\nChecks if a given value is a `Map` object. This is more reliable than the\n`instanceof Map` method, as it will work across different realms and\nenvironments, and it does not consider objects that were not created with\n`new Map()` to be instances of a `Map`.\n\n```ts\nimport { isMap } from \"@nick/is\";\n\nconst map = new Map();\nisMap(map); // true\nisMap({}); // false\n```\n\n\u003e **Aliases**: `is.map` [JSR Documentation](https://jsr.io/@nick/is/doc/~/isMap)\n\n#### `isSet`\n\nChecks if a given value is a `Set` object. This is more reliable than the\n`instanceof Set` method, as it will work across different realms and\nenvironments, and it does not consider objects that were not created with\n`new Set()` to be instances of a `Set`.\n\n```ts\nimport { isSet } from \"@nick/is\";\n\nconst set = new Set();\nisSet(set); // true\nisSet({}); // false\n```\n\n\u003e **Aliases**: `is.set` [JSR Documentation](https://jsr.io/@nick/is/doc/~/isSet)\n\n---\n\n### Weak Collections\n\n#### `isWeakMap`\n\nChecks if a given value is a `WeakMap` object. This is more reliable than the\n`instanceof WeakMap` method, as it will work across different realms and\nenvironments, and it does not consider objects that were not created with\n`new WeakMap()` to be instances of a `WeakMap`.\n\n```ts\nimport { isWeakMap } from \"@nick/is\";\n\nconst weakMap = new WeakMap();\nisWeakMap(weakMap); // true\nisWeakMap({}); // false\n```\n\n\u003e **Aliases**: `is.weakMap`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWeakMap)\n\n#### `isWeakSet`\n\nChecks if a given value is a `WeakSet` object. This is more reliable than the\n`instanceof WeakSet` method, as it will work across different realms and\nenvironments, and it does not consider objects that were not created with\n`new WeakSet()` to be instances of a `WeakSet`.\n\n```ts\nimport { isWeakSet } from \"@nick/is\";\n\nconst weakSet = new WeakSet();\nisWeakSet(weakSet); // true\nisWeakSet({}); // false\n```\n\n\u003e **Aliases**: `is.weakSet`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWeakSet)\n\n#### `isWeakRef`\n\nChecks if a given value is a `WeakRef` object. This is more reliable than the\n`instanceof WeakRef` method, as it will work across different realms and\nenvironments, and it does not consider objects that were not created with\n`new WeakRef()` to be instances of a `WeakRef`.\n\n```ts\nimport { isWeakRef } from \"@nick/is\";\n\nconst weakRef = new WeakRef({});\nisWeakRef(weakRef); // true\nisWeakRef({}); // false\n```\n\n\u003e **Aliases**: `is.weakRef`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWeakRef)\n\n#### `isWeakKey`\n\nChecks if a given value is suitable for use as a key in a `WeakMap` or\n`WeakSet`, or as a target value in a `WeakRef`.\n\n```ts\nimport { isWeakKey } from \"@nick/is\";\n\nisWeakKey({}); // true\nisWeakKey(() =\u003e {}); // true\nisWeakKey(Symbol()); // true\nisWeakKey(0); // false\n```\n\n\u003e **Aliases**: `is.weakKey`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWeakKey)\n\n---\n\n### Iterables\n\n#### `isIterable`\n\nChecks if a given value is an iterable with a `Symbol.iterator` method.\n\n```ts\nimport { isIterable } from \"@nick/is\";\n\nisIterable([]); // true\nisIterable(\"hello\"); // true\nisIterable(0); // false\n```\n\n\u003e **Aliases**: `is.iterable`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isIterable)\n\n#### `isIterator`\n\nChecks if a given value is an iterator, meaning it has a `next` method that\nreturns an object with `value` and `done` properties.\n\n```ts\nimport { isIterator } from \"@nick/is\";\n\nconst iterator = [][Symbol.iterator]();\nisIterator(iterator); // true\nisIterator(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.iterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isIterator)\n\n#### `isIterableIterator`\n\nChecks if a given value is an `IterableIterator` implementation, meaning it is\n\n```ts\nimport { isIterableIterator } from \"@nick/is\";\n\nconst iterator = [][Symbol.iterator]();\nconst iterable = {\n  *[Symbol.iterator]() {\n    yield 1;\n  },\n};\n\nisIterableIterator(iterable); // false\nisIterableIterator(iterable[Symbol.iterator]()); // true\nisIterableIterator(iterator); // true\n```\n\n\u003e **Aliases**: `is.iterableIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isIterableIterator)\n\n#### `isAsyncIterable`\n\nChecks if a given value is an async iterable object, meaning it has a\n`Symbol.asyncIterator` method, and therefore is an implementation of the\n`AsyncIterable` interface.\n\n```ts\nimport { isAsyncIterable } from \"@nick/is\";\n\nconst posts = {\n  async *[Symbol.asyncIterator]() {\n    const posts = await fetch(\"https://jsonplaceholder.typicode.com/posts\");\n    yield* await posts.json();\n  },\n};\nisAsyncIterable(posts); // true\n\nconst numbers = [1, 2, 3];\nisAsyncIterable(numbers); // false\n```\n\n\u003e **Aliases**: `is.asyncIterable`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isAsyncIterable)\n\n#### `isAsyncIterator`\n\nChecks if a given value is an async iterator, meaning it has a `next` method\nthat returns a promise that resolves to an object with `value` and `done`\nproperties, implementing the `AsyncIterator` interface.\n\n```ts\nimport { isAsyncIterator } from \"@nick/is\";\n\n{\n  await using kv = await Deno.openKv();\n  const iter = kv.list({ prefix: [] });\n\n  if (isAsyncIterator(iter)) {\n    // this condition should always evaluate to true\n    let n = 0;\n    for await (const { key, value } of iter) {\n      if (n++ \u003e 10) break; // limit to 10 items\n      console.log(\"key:\", key, \"\\nvalue:\", value, \"\\ncursor:\", iter.cursor);\n    }\n  }\n}\n```\n\n\u003e **Aliases**: `is.asyncIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isAsyncIterator)\n\n#### `isAsyncIterableIterator`\n\nChecks if a value is an `AsyncIterableIterator` implementation, which is both an\nasync iterator with a `next` method that returns a promise, and also an\nasynchronous iterable with a `Symbol.asyncIterator` method.\n\n```ts\nimport { isAsyncIterableIterator } from \"@nick/is\";\n\nconst items = {\n  async *[Symbol.asyncIterator]() {\n    yield 1;\n    // simulate blocking I/O\n    await new Promise((resolve) =\u003e setTimeout(resolve, 1000));\n    yield 2;\n  },\n};\n\nisAsyncIterableIterator(items); // false\nisAsyncIterableIterator(items[Symbol.asyncIterator]()); // true\n```\n\n\u003e **Aliases**: `is.asyncIterableIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isAsyncIterableIterator)\n\n---\n\n### Iterators\n\n#### `isArrayIterator`\n\nChecks if a given value is an array iterator, meaning it is an iterator object\nthat was created by calling the `Symbol.iterator` method on an array.\n\n```ts\nimport { isArrayIterator } from \"@nick/is\";\n\nconst iterator = [][Symbol.iterator]();\nisArrayIterator(iterator); // true\nisArrayIterator(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.arrayIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayIterator)\n\n#### `isMapIterator`\n\nChecks if a given value is a map iterator, meaning it is an iterator object that\nwas created by calling the `entries`, `keys`, or `values` method on a map.\n\n```ts\nimport { isMapIterator } from \"@nick/is\";\n\nconst map = new Map();\nconst iterator = map.entries();\nisMapIterator(iterator); // true\nisMapIterator(map[Symbol.iterator]()); // true\nisMapIterator(\"hello\"[Symbol.iterator]()); // false\n```\n\n\u003e **Aliases**: `is.mapIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isMapIterator)\n\n#### `isSetIterator`\n\nChecks if a given value is a set iterator, meaning it is an iterator object that\nwas created by calling the `entries`, `keys`, or `values` method on a set.\n\n```ts\nimport { isSetIterator } from \"@nick/is\";\n\nconst set = new Set();\nconst iterator = set.values();\nisSetIterator(iterator); // true\nisSetIterator(set[Symbol.iterator]()); // true\nisSetIterator(\"hello\"[Symbol.iterator]()); // false\n```\n\n\u003e **Aliases**: `is.setIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isSetIterator)\n\n#### `isStringIterator`\n\nChecks if a given value is a string iterator, meaning it is an iterator object\nthat was created by calling the `Symbol.iterator` method on a string.\n\n```ts\nimport { isStringIterator } from \"@nick/is\";\n\nconst iterator = \"hello\"[Symbol.iterator]();\nisStringIterator(iterator); // true\nisStringIterator(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.stringIterator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isStringIterator)\n\n#### `isIterableObject`\n\nChecks if a given value is an iterable object, meaning it is an object with a\n`Symbol.iterator` method that returns an iterator.\n\n```ts\nimport { isIterableObject } from \"@nick/is\";\n\nconst iterable = {\n  *[Symbol.iterator]() {\n    yield 1;\n  },\n};\nisIterableObject(iterable); // true\nisIterableObject(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.iterableObject`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isIterableObject)\n\n---\n\n### Generators\n\n#### `isGenerator`\n\nChecks if a given value is a generator function, meaning it is a function that\nreturns a generator object when called.\n\n```ts\nimport { isGenerator } from \"@nick/is\";\n\nconst generator = function* () {\n  yield 1;\n};\nisGenerator(generator); // true\nisGenerator(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.generator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isGenerator)\n\n#### `isGeneratorFunction`\n\nChecks if a given value is a generator function, meaning it is a function that\nreturns a generator object when called.\n\n```ts\nimport { isGeneratorFunction } from \"@nick/is\";\n\nconst generator = function* () {\n  yield 1;\n};\nisGeneratorFunction(generator); // true\nisGeneratorFunction(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.generatorFunction`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isGeneratorFunction)\n\n#### `isAsyncGenerator`\n\nChecks if a given value is an async generator function, meaning it is a function\nthat returns an async generator object when called.\n\n```ts\nimport { isAsyncGenerator } from \"@nick/is\";\n\nconst asyncGenerator = async function* () {\n  yield 1;\n};\nisAsyncGenerator(asyncGenerator); // true\nisAsyncGenerator(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.asyncGenerator`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isAsyncGenerator)\n\n#### `isAsyncGeneratorFunction`\n\nChecks if a given value is an async generator function, meaning it is a function\nthat returns an async generator object when called.\n\n```ts\nimport { isAsyncGeneratorFunction } from \"@nick/is\";\n\nconst asyncGenerator = async function* () {\n  yield 1;\n};\nisAsyncGeneratorFunction(asyncGenerator); // true\nisAsyncGeneratorFunction(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.asyncGeneratorFunction`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isAsyncGeneratorFunction)\n\n---\n\n### Streams\n\n#### `isReadableStream`\n\nChecks if a given value is a readable stream, meaning it is a valid\nimplementation of the `ReadableStream` interface.\n\n```ts\nimport { isReadableStream } from \"@nick/is\";\n\nconst stream = new ReadableStream({ start() {} });\nisReadableStream(stream); // true\nisReadableStream(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.readableStream`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isReadableStream)\n\n#### `isWritableStream`\n\nChecks if a given value is a writable stream, meaning it is a valid\nimplementation of the `WritableStream` interface.\n\n```ts\nimport { isWritableStream } from \"@nick/is\";\n\nconst stream = new WritableStream({ write() {} });\nisWritableStream(stream); // true\nisWritableStream(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.writableStream`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWritableStream)\n\n---\n\n### I/O\n\n#### `isReader`\n\nChecks if a given value is a reader, meaning it is a valid implementation of the\n`Deno.Reader` interface. This is not the same as the `ReadableStream`\ninterface's `ReadableStreamDefaultReader` type, which is a different kind of\nreader.\n\n```ts\nimport { isReader } from \"@nick/is\";\n\nconst reader = Deno.openSync(\"hello.txt\");\nisReader(reader); // true\nisReader(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.reader`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isReader)\n\n#### `isReaderSync`\n\nChecks if a given value is a synchronous reader, meaning it is a valid\nimplementation of the `ReaderSync` interface.\n\n```ts\nimport { isReaderSync } from \"@nick/is\";\n\nconst reader = Deno.openSync(\"hello.txt\");\nisReaderSync(reader); // true\n```\n\n\u003e **Aliases**: `is.readerSync`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isReaderSync)\n\n#### `isWriter`\n\nChecks if a given value is a writer, meaning it is a valid implementation of the\n`Deno.Writer` interface. This is not the same as the `WritableStream`\ninterface's `WritableStreamDefaultWriter` type, which is a different kind of\nwriter.\n\n```ts\nimport { isWriter } from \"@nick/is\";\n\nconst writer = Deno.openSync(\"hello.txt\");\nisWriter(writer); // true\nisWriter(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.writer`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWriter)\n\n#### `isWriterSync`\n\nChecks if a given value is a synchronous writer, meaning it is a valid\nimplementation of the `WriterSync` interface.\n\n```ts\nimport { isWriterSync } from \"@nick/is\";\n\nconst writer = Deno.openSync(\"hello.txt\");\nisWriterSync(writer); // true\n```\n\n\u003e **Aliases**: `is.writerSync`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isWriterSync)\n\n#### `isCloser`\n\nChecks if a given value is a closer, meaning it is a valid implementation of the\n`Deno.Closer` interface.\n\n```ts\nimport { isCloser } from \"@nick/is\";\n\nconst closer = Deno.openSync(\"hello.txt\");\nisCloser(closer); // true\nisCloser(\"hello\"); // false\n```\n\n\u003e **Aliases**: `is.closer`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isCloser)\n\n---\n\n### Template Literals\n\n#### `isTemplateStringsArray`\n\nChecks if a given value is a template strings array, meaning it is an array of\nstrings that were used as the first argument to a tagged template literal\nfunction.\n\n```ts\nimport { isTemplateStringsArray } from \"@nick/is\";\n\nfunction outdent(string: string): string;\nfunction outdent(strings: TemplateStringsArray, ...args: unknown[]): string;\nfunction outdent(input: string | TemplateStringsArray, ...args: unknown[]) {\n  if (isTemplateStringsArray(input)) {\n    input = String.raw(input, ...args);\n  }\n\n  // don't actually do it like this...\n  return input.replace(/^\\n/, \"\").replace(/\\n\\s+/g, \"\\n\");\n}\n```\n\n\u003e **Aliases**: `is.templateStringsArray`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isTemplateStringsArray)\n\n---\n\n### Binary Data Structures\n\n#### `isBufferSource`\n\nChecks if a given value is a `BufferSource` object, meaning it is either an\n`ArrayBuffer`, `SharedArrayBuffer`, `TypedArray`, or a `DataView`.\n\n```ts\nimport { isBufferSource } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst view = new DataView(buffer);\nconst array = new Uint8Array(buffer);\n\nisBufferSource(buffer); // true\nisBufferSource(view); // true\nisBufferSource(array); // true\nisBufferSource({}); // false\n```\n\n\u003e **Aliases**: `is.bufferSource`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isBufferSource)\n\n#### `isArrayBuffer`\n\nChecks if a given value is an `ArrayBuffer` object, which is a fixed-length\nbinary data buffer. This does not consider `SharedArrayBuffer` objects as\ninterchangeable with `ArrayBuffer` objects; to check for both types at once, use\nthe [`isArrayBufferLike`] type guard.\n\n```ts\nimport { isArrayBuffer } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst shared = new SharedArrayBuffer(8);\n\nisArrayBuffer(buffer); // true\nisArrayBuffer(shared); // false\n```\n\n\u003e **Aliases**: `is.arrayBuffer`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayBuffer)\n\n#### `isSharedArrayBuffer`\n\nChecks if a given value is a `SharedArrayBuffer` object, which is a fixed-length\nbinary data buffer that can be shared between multiple agents (such as workers).\n\n```ts\nimport { isSharedArrayBuffer } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst shared = new SharedArrayBuffer(8);\n\nisSharedArrayBuffer(buffer); // false\nisSharedArrayBuffer(shared); // true\n```\n\n\u003e **Aliases**: `is.sharedArrayBuffer`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isSharedArrayBuffer)\n\n#### `isArrayBufferLike`\n\nChecks if a given value is an `ArrayBuffer` or `SharedArrayBuffer` object.\n\n```ts\nimport { isArrayBufferLike } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst shared = new SharedArrayBuffer(8);\n\nisArrayBufferLike(buffer); // true\nisArrayBufferLike(shared); // true\n```\n\n\u003e **Aliases**: `is.arrayBufferLike`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayBufferLike)\n\n#### `isArrayBufferView`\n\nChecks if a given value is an `ArrayBufferView` object, meaning it is either a\n`TypedArray` or a `DataView`.\n\n```ts\nimport { isArrayBufferView } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst view = new DataView(buffer);\nconst array = new Uint8Array(buffer);\nconst object = {};\n\nisArrayBufferView(object); // false\nisArrayBufferView(buffer); // false\nisArrayBufferView(view); // true\nisArrayBufferView(array); // true\n```\n\n\u003e **Aliases**: `is.arrayBufferView`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isArrayBufferView)\n\n#### `isDataView`\n\nChecks if a given value is a `DataView` object, which is a view of an\n`ArrayBuffer` that allows reading and writing of the buffer's contents.\n\n```ts\nimport { isDataView } from \"@nick/is\";\n\nconst buffer = new ArrayBuffer(8);\nconst view = new DataView(buffer);\nconst object = {};\n\nisDataView(object); // false\nisDataView(buffer); // false\nisDataView(view); // true\n```\n\n\u003e **Aliases**: `is.dataView`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isDataView)\n\n#### `isTypedArray`\n\nChecks if a given value is a typed array, meaning it is an instance of one of\nthe `TypedArray` constructors, such as `Int8Array`, `Uint8Array`, etc.\n\n```ts\nimport { isTypedArray } from \"@nick/is\";\n\nconst real = new Int8Array();\nconsole.log(\"isTypedArray(real)\", isTypedArray(real)); // true\n\nconst fake = Object.create(Int8Array.prototype);\nconsole.log(\"isTypedArray(fake)\", isTypedArray(fake)); // false\nconsole.log(\"fake instanceof\", fake instanceof Int8Array); // true (?!)\n```\n\n\u003e **Aliases**: `is.typedArray`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isTypedArray)\n\nYou can also use it to check for a specific typed array type by name:\n\n```ts\nimport { isTypedArray } from \"@nick/is\";\n\nconst array = new Uint8Array();\n\nconsole.assert(isTypedArray(array)); // OK\nconsole.assert(isTypedArray(array, \"Uint8Array\")); // OK\nconsole.assert(!isTypedArray(array, \"Int8Array\")); // invalid type\nconsole.assert(!isTypedArray(array.buffer)); // ArrayBuffer != TypedArray\n```\n\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isTypedArray)\n\n#### `isUint8Array`\n\nChecks if a given value is a `Uint8Array` object, which is a typed array of\n8-bit unsigned integers.\n\n```ts\nimport { isUint8Array } from \"@nick/is\";\n\nconst array = new Uint8Array();\n\nconsole.assert(isUint8Array(array)); // true\nconsole.assert(!isUint8Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.uint8Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isUint8Array)\n\n#### `isUint8ClampedArray`\n\nChecks if a given value is a `Uint8ClampedArray` object, which is a typed array\nof 8-bit unsigned integers that are clamped to 0-255.\n\n```ts\nimport { isUint8ClampedArray } from \"@nick/is\";\n\nconst array = new Uint8ClampedArray();\n\nconsole.assert(isUint8ClampedArray(array)); // true\nconsole.assert(!isUint8ClampedArray(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.uint8ClampedArray`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isUint8ClampedArray)\n\n#### `isUint16Array`\n\nChecks if a given value is a `Uint16Array` object, which is a typed array of\n16-bit unsigned integers.\n\n```ts\nimport { isUint16Array } from \"@nick/is\";\n\nconst array = new Uint16Array();\n\nconsole.assert(isUint16Array(array)); // true\nconsole.assert(!isUint16Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.uint16Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isUint16Array)\n\n#### `isUint32Array`\n\nChecks if a given value is a `Uint32Array` object, which is a typed array of\n32-bit unsigned integers.\n\n```ts\nimport { isUint32Array } from \"@nick/is\";\n\nconst array = new Uint32Array();\n\nconsole.assert(isUint32Array(array)); // true\nconsole.assert(!isUint32Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.uint32Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isUint32Array)\n\n#### `isInt8Array`\n\nChecks if a given value is an `Int8Array` object, which is a typed array of\n8-bit signed integers.\n\n```ts\nimport { isInt8Array } from \"@nick/is\";\n\nconst array = new Int8Array();\n\nconsole.assert(isInt8Array(array)); // true\nconsole.assert(!isInt8Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.int8Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isInt8Array)\n\n#### `isInt16Array`\n\nChecks if a given value is an `Int16Array` object, which is a typed array of\n16-bit signed integers.\n\n```ts\nimport { isInt16Array } from \"@nick/is\";\n\nconst array = new Int16Array();\n\nconsole.assert(isInt16Array(array)); // true\nconsole.assert(!isInt16Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.int16Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isInt16Array)\n\n#### `isInt32Array`\n\nChecks if a given value is an `Int32Array` object, which is a typed array of\n32-bit signed integers.\n\n```ts\nimport { isInt32Array } from \"@nick/is\";\n\nconst array = new Int32Array();\n\nconsole.assert(isInt32Array(array)); // true\nconsole.assert(!isInt32Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.int32Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isInt32Array)\n\n#### `isFloat16Array`\n\nChecks if a given value is a `Float16Array` object, which is a typed array of\n16-bit half-precision floating point numbers.\n\n```ts\nimport { isFloat16Array } from \"@nick/is\";\n\nconst array = new Float16Array();\n\nconsole.assert(isFloat16Array(array)); // true\nconsole.assert(!isFloat16Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.float16Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isFloat16Array)\n\n#### `isFloat32Array`\n\nChecks if a given value is a `Float32Array` object, which is a typed array of\n32-bit single-precision floating point numbers.\n\n```ts\nimport { isFloat32Array } from \"@nick/is\";\n\nconst array = new Float32Array();\n\nconsole.assert(isFloat32Array(array)); // true\nconsole.assert(!isFloat32Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.float32Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isFloat32Array)\n\n#### `isFloat64Array`\n\nChecks if a given value is a `Float64Array` object, which is a typed array of\n64-bit double-precision floating point numbers.\n\n```ts\nimport { isFloat64Array } from \"@nick/is\";\n\nconst array = new Float64Array();\n\nconsole.assert(isFloat64Array(array)); // true\nconsole.assert(!isFloat64Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.float64Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isFloat64Array)\n\n#### `isBigInt64Array`\n\nChecks if a given value is a `BigInt64Array` object, which is a typed array of\n64-bit signed integers (BigInts).\n\n```ts\nimport { isBigInt64Array } from \"@nick/is\";\n\nconst array = new BigInt64Array();\n\nconsole.assert(isBigInt64Array(array)); // true\nconsole.assert(!isBigInt64Array(array.buffer)); // false\n```\n\n\u003e **Aliases**: `is.bigInt64Array`\n\u003e [JSR Documentation](https://jsr.io/@nick/is/doc/~/isBigInt64Array)\n\n---\n\n## Appendix\n\n### Contributing\n\nContributing to the `@nick/is` project is **warmly** welcomed! If you've found a\nbug, have an idea for a new feature, or have the time to fix or implement one of\nthe existing issues, please feel free to open a pull request. Before doing so, I\njust ask that you take a moment to read through the [contributing guidelines]\nand [code of conduct] to ensure your contributions align with the project's\nvalues and goals.\n\nIf you plan on opening a pull request, please be sure to [open an issue] for it\nfirst, so that we can discuss the changes and have a place to track the progress\ntowards merging them. This helps ensure you don't spend time working on\nsomething that's already being implemented (or, for example, left out of the\nproject's scope or roadmap for some particular reason).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cb\u003e\u003cbig\u003e\n\n[MIT] © [Nicholas Berlette]\n\u003c/big\u003e. All rights reserved.\u003c/b\u003e\n\n\u003csmall\u003e\n\n**[Docs] · [JSR] · [NPM] · [GitHub] · [Issues]**\n\n\u003c/small\u003e\n\n\u003c/div\u003e\n\n[MIT]: https://nick.mit-license.org \"MIT License. Copyright © 2024-2025+ Nicholas Berlette. All rights reserved.\"\n[Nicholas Berlette]: https://github.com/nberlette#readme \"Nicholas Berlette on GitHub\"\n[GitHub]: https://github.com/nberlette/is#readme \"Give the @nick/is package a Star on GitHub! 🌟\"\n[JSR]: https://jsr.io/@nick/is \"Check out the @nick/is package on JSR!\"\n[NPM]: https://npmjs.com/package/@n.ck/is \"Check out @n.ck/is on NPM! (yep, 'i' got left out of npm/@nick .... get it? :p)\"\n[Docs]: https://jsr.io/@nick/is/doc \"View the full @nick/is API documentation on JSR!\"\n[Issues]: https://github.com/nberlette/type/issues \"GitHub Issue tracker for @nick/is\"\n[open an issue]: https://github.com/nberlette/is/issues/new \"Open a New Issue on the GitHub Repository for @nick/is\"\n[contributing guidelines]: https://github.com/nberlette/is/blob/main/.github/CONTRIBUTING.md \"Contributing Guidelines\"\n[code of conduct]: https://github.com/nberlette/is/blob/main/.github/CODE_OF_CONDUCT.md \"Contributor's Code of Conduct\"\n[badge-jsr]: https://jsr.io/badges/@nick/is?style=for-the-badge\n[badge-issues]: https://img.shields.io/github/issues/nberlette/is?color=123\u0026labelColor=123\u0026style=for-the-badge\n[badge-issues-pull]: https://img.shields.io/github/issues-pr/nberlette/is?color=123\u0026labelColor=123\u0026style=for-the-badge\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnberlette%2Fis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnberlette%2Fis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnberlette%2Fis/lists"}