util.types provides type checks for different kinds of built-in objects.
Unlike instanceof or Object.prototype.toString.call(value), these checks do
not inspect properties of the object that are accessible from JavaScript (like
their prototype), and usually have the overhead of calling into C++.
The result generally does not make any guarantees about what kinds of properties or behavior a value exposes in JavaScript. They are primarily useful for addon developers who prefer to do type checking in JavaScript.
The API is accessible via require('node:util').types or require('node:util/types').
util.types.isAnyArrayBuffer(value): boolean
Returns true if the value is a built-in ArrayBuffer or
SharedArrayBuffer instance.
See also util.types.isArrayBuffer() and
util.types.isSharedArrayBuffer().
util.types.isAnyArrayBuffer(new ArrayBuffer()); // Returns true util.types.isAnyArrayBuffer(new SharedArrayBuffer()); // Returns true
util.types.isArrayBufferView(value): boolean
Returns true if the value is an instance of one of the ArrayBuffer
views, such as typed array objects or DataView. Equivalent to
ArrayBuffer.isView().
util.types.isArrayBufferView(new Int8Array()); // true util.types.isArrayBufferView(Buffer.from('hello world')); // true util.types.isArrayBufferView(new DataView(new ArrayBuffer(16))); // true util.types.isArrayBufferView(new ArrayBuffer()); // false
util.types.isArgumentsObject(value): boolean
Returns true if the value is an arguments object.
function foo() { util.types.isArgumentsObject(arguments); // Returns true }
util.types.isArrayBuffer(value): boolean
Returns true if the value is a built-in ArrayBuffer instance.
This does not include SharedArrayBuffer instances. Usually, it is
desirable to test for both; See util.types.isAnyArrayBuffer() for that.
util.types.isArrayBuffer(new ArrayBuffer()); // Returns true util.types.isArrayBuffer(new SharedArrayBuffer()); // Returns false
util.types.isAsyncFunction(value): boolean
Returns true if the value is an async function.
This only reports back what the JavaScript engine is seeing;
in particular, the return value may not match the original source code if
a transpilation tool was used.
util.types.isAsyncFunction(function foo() {}); // Returns false util.types.isAsyncFunction(async function foo() {}); // Returns true
util.types.isBigInt64Array(value): boolean
Returns true if the value is a BigInt64Array instance.
util.types.isBigInt64Array(new BigInt64Array()); // Returns true util.types.isBigInt64Array(new BigUint64Array()); // Returns false
util.types.isBigIntObject(value): boolean
Returns true if the value is a BigInt object, e.g. created
by Object(BigInt(123)).
util.types.isBigIntObject(Object(BigInt(123))); // Returns true util.types.isBigIntObject(BigInt(123)); // Returns false util.types.isBigIntObject(123); // Returns false
util.types.isBigUint64Array(value): boolean
Returns true if the value is a BigUint64Array instance.
util.types.isBigUint64Array(new BigInt64Array()); // Returns false util.types.isBigUint64Array(new BigUint64Array()); // Returns true
util.types.isBooleanObject(value): boolean
Returns true if the value is a boolean object, e.g. created
by new Boolean().
util.types.isBooleanObject(false); // Returns false util.types.isBooleanObject(true); // Returns false util.types.isBooleanObject(new Boolean(false)); // Returns true util.types.isBooleanObject(new Boolean(true)); // Returns true util.types.isBooleanObject(Boolean(false)); // Returns false util.types.isBooleanObject(Boolean(true)); // Returns false
util.types.isBoxedPrimitive(value): boolean
Returns true if the value is any boxed primitive object, e.g. created
by new Boolean(), new String() or Object(Symbol()).
For example:
util.types.isBoxedPrimitive(false); // Returns false util.types.isBoxedPrimitive(new Boolean(false)); // Returns true util.types.isBoxedPrimitive(Symbol('foo')); // Returns false util.types.isBoxedPrimitive(Object(Symbol('foo'))); // Returns true util.types.isBoxedPrimitive(Object(BigInt(5))); // Returns true
util.types.isCryptoKey(value): boolean
Returns true if value is a CryptoKey, false otherwise.
util.types.isDataView(value): boolean
Returns true if the value is a built-in DataView instance.
const ab = new ArrayBuffer(20); util.types.isDataView(new DataView(ab)); // Returns true util.types.isDataView(new Float64Array()); // Returns false
See also ArrayBuffer.isView().
util.types.isDate(value): boolean
Returns true if the value is a built-in Date instance.
util.types.isDate(new Date()); // Returns true
util.types.isExternal(value): boolean
Returns true if the value is a native External value.
A native External value is a special type of object that contains a
raw C++ pointer (void*) for access from native code, and has no other
properties. Such objects are created either by Node.js internals or native
addons. In JavaScript, they are frozen objects with a
null prototype.
#include <js_native_api.h> #include <stdlib.h> napi_value result; static napi_value MyNapi(napi_env env, napi_callback_info info) { int* raw = (int*) malloc(1024); napi_status status = napi_create_external(env, (void*) raw, NULL, NULL, &result); if (status != napi_ok) { napi_throw_error(env, NULL, "napi_create_external failed"); return NULL; } return result; } ... DECLARE_NAPI_PROPERTY("myNapi", MyNapi) ...
import native from 'napi_addon.node'; import { types } from 'node:util'; const data = native.myNapi(); types.isExternal(data); // returns true types.isExternal(0); // returns false types.isExternal(new String('foo')); // returns false
const native = require('napi_addon.node'); const { types } = require('node:util'); const data = native.myNapi(); types.isExternal(data); // returns true types.isExternal(0); // returns false types.isExternal(new String('foo')); // returns false
For further information on napi_create_external, refer to
napi_create_external().
util.types.isFloat16Array(value): boolean
Returns true if the value is a built-in Float16Array instance.
util.types.isFloat16Array(new ArrayBuffer()); // Returns false util.types.isFloat16Array(new Float16Array()); // Returns true util.types.isFloat16Array(new Float32Array()); // Returns false
util.types.isFloat32Array(value): boolean
Returns true if the value is a built-in Float32Array instance.
util.types.isFloat32Array(new ArrayBuffer()); // Returns false util.types.isFloat32Array(new Float32Array()); // Returns true util.types.isFloat32Array(new Float64Array()); // Returns false
util.types.isFloat64Array(value): boolean
Returns true if the value is a built-in Float64Array instance.
util.types.isFloat64Array(new ArrayBuffer()); // Returns false util.types.isFloat64Array(new Uint8Array()); // Returns false util.types.isFloat64Array(new Float64Array()); // Returns true
util.types.isGeneratorFunction(value): boolean
Returns true if the value is a generator function.
This only reports back what the JavaScript engine is seeing;
in particular, the return value may not match the original source code if
a transpilation tool was used.
util.types.isGeneratorFunction(function foo() {}); // Returns false util.types.isGeneratorFunction(function* foo() {}); // Returns true
util.types.isGeneratorObject(value): boolean
Returns true if the value is a generator object as returned from a
built-in generator function.
This only reports back what the JavaScript engine is seeing;
in particular, the return value may not match the original source code if
a transpilation tool was used.
function* foo() {} const generator = foo(); util.types.isGeneratorObject(generator); // Returns true
util.types.isInt8Array(value): boolean
Returns true if the value is a built-in Int8Array instance.
util.types.isInt8Array(new ArrayBuffer()); // Returns false util.types.isInt8Array(new Int8Array()); // Returns true util.types.isInt8Array(new Float64Array()); // Returns false
util.types.isInt16Array(value): boolean
Returns true if the value is a built-in Int16Array instance.
util.types.isInt16Array(new ArrayBuffer()); // Returns false util.types.isInt16Array(new Int16Array()); // Returns true util.types.isInt16Array(new Float64Array()); // Returns false
util.types.isInt32Array(value): boolean
Returns true if the value is a built-in Int32Array instance.
util.types.isInt32Array(new ArrayBuffer()); // Returns false util.types.isInt32Array(new Int32Array()); // Returns true util.types.isInt32Array(new Float64Array()); // Returns false
util.types.isKeyObject(value): boolean
Returns true if value is a KeyObject, false otherwise.
util.types.isMap(value): boolean
Returns true if the value is a built-in Map instance.
util.types.isMap(new Map()); // Returns true
util.types.isMapIterator(value): boolean
Returns true if the value is an iterator returned for a built-in
Map instance.
const map = new Map(); util.types.isMapIterator(map.keys()); // Returns true util.types.isMapIterator(map.values()); // Returns true util.types.isMapIterator(map.entries()); // Returns true util.types.isMapIterator(map[Symbol.iterator]()); // Returns true
util.types.isModuleNamespaceObject(value): boolean
Returns true if the value is an instance of a Module Namespace Object.
import * as ns from './a.js'; util.types.isModuleNamespaceObject(ns); // Returns true
util.types.isNativeError(value): boolean
Error.isError instead.Note: As of Node.js 24, Error.isError() is currently slower than util.types.isNativeError().
If performance is critical, consider benchmarking both in your environment.
Returns true if the value was returned by the constructor of a
built-in Error type.
console.log(util.types.isNativeError(new Error())); // true console.log(util.types.isNativeError(new TypeError())); // true console.log(util.types.isNativeError(new RangeError())); // true
Subclasses of the native error types are also native errors:
class MyError extends Error {} console.log(util.types.isNativeError(new MyError())); // true
A value being instanceof a native error class is not equivalent to isNativeError()
returning true for that value. isNativeError() returns true for errors
which come from a different realm while instanceof Error returns false
for these errors:
import { createContext, runInContext } from 'node:vm'; import { types } from 'node:util'; const context = createContext({}); const myError = runInContext('new Error()', context); console.log(types.isNativeError(myError)); // true console.log(myError instanceof Error); // false
const { createContext, runInContext } = require('node:vm'); const { types } = require('node:util'); const context = createContext({}); const myError = runInContext('new Error()', context); console.log(types.isNativeError(myError)); // true console.log(myError instanceof Error); // false
Conversely, isNativeError() returns false for all objects which were not
returned by the constructor of a native error. That includes values
which are instanceof native errors:
const myError = { __proto__: Error.prototype }; console.log(util.types.isNativeError(myError)); // false console.log(myError instanceof Error); // true
util.types.isNumberObject(value): boolean
Returns true if the value is a number object, e.g. created
by new Number().
util.types.isNumberObject(0); // Returns false util.types.isNumberObject(new Number(0)); // Returns true
util.types.isPromise(value): boolean
Returns true if the value is a built-in Promise.
util.types.isPromise(Promise.resolve(42)); // Returns true
util.types.isProxy(value): boolean
Returns true if the value is a Proxy instance.
const target = {}; const proxy = new Proxy(target, {}); util.types.isProxy(target); // Returns false util.types.isProxy(proxy); // Returns true
util.types.isRegExp(value): boolean
Returns true if the value is a regular expression object.
util.types.isRegExp(/abc/); // Returns true util.types.isRegExp(new RegExp('abc')); // Returns true
util.types.isSet(value): boolean
Returns true if the value is a built-in Set instance.
util.types.isSet(new Set()); // Returns true
util.types.isSetIterator(value): boolean
Returns true if the value is an iterator returned for a built-in
Set instance.
const set = new Set(); util.types.isSetIterator(set.keys()); // Returns true util.types.isSetIterator(set.values()); // Returns true util.types.isSetIterator(set.entries()); // Returns true util.types.isSetIterator(set[Symbol.iterator]()); // Returns true
util.types.isSharedArrayBuffer(value): boolean
Returns true if the value is a built-in SharedArrayBuffer instance.
This does not include ArrayBuffer instances. Usually, it is
desirable to test for both; See util.types.isAnyArrayBuffer() for that.
util.types.isSharedArrayBuffer(new ArrayBuffer()); // Returns false util.types.isSharedArrayBuffer(new SharedArrayBuffer()); // Returns true
util.types.isStringObject(value): boolean
Returns true if the value is a string object, e.g. created
by new String().
util.types.isStringObject('foo'); // Returns false util.types.isStringObject(new String('foo')); // Returns true
util.types.isSymbolObject(value): boolean
Returns true if the value is a symbol object, created
by calling Object() on a Symbol primitive.
const symbol = Symbol('foo'); util.types.isSymbolObject(symbol); // Returns false util.types.isSymbolObject(Object(symbol)); // Returns true
util.types.isTypedArray(value): boolean
Returns true if the value is a built-in TypedArray instance.
util.types.isTypedArray(new ArrayBuffer()); // Returns false util.types.isTypedArray(new Uint8Array()); // Returns true util.types.isTypedArray(new Float64Array()); // Returns true
See also ArrayBuffer.isView().
util.types.isUint8Array(value): boolean
Returns true if the value is a built-in Uint8Array instance.
util.types.isUint8Array(new ArrayBuffer()); // Returns false util.types.isUint8Array(new Uint8Array()); // Returns true util.types.isUint8Array(new Float64Array()); // Returns false
util.types.isUint8ClampedArray(value): boolean
Returns true if the value is a built-in Uint8ClampedArray instance.
util.types.isUint8ClampedArray(new ArrayBuffer()); // Returns false util.types.isUint8ClampedArray(new Uint8ClampedArray()); // Returns true util.types.isUint8ClampedArray(new Float64Array()); // Returns false
util.types.isUint16Array(value): boolean
Returns true if the value is a built-in Uint16Array instance.
util.types.isUint16Array(new ArrayBuffer()); // Returns false util.types.isUint16Array(new Uint16Array()); // Returns true util.types.isUint16Array(new Float64Array()); // Returns false
util.types.isUint32Array(value): boolean
Returns true if the value is a built-in Uint32Array instance.
util.types.isUint32Array(new ArrayBuffer()); // Returns false util.types.isUint32Array(new Uint32Array()); // Returns true util.types.isUint32Array(new Float64Array()); // Returns false
util.types.isWeakMap(value): boolean
Returns true if the value is a built-in WeakMap instance.
util.types.isWeakMap(new WeakMap()); // Returns true
util.types.isWeakSet(value): boolean
Returns true if the value is a built-in WeakSet instance.
util.types.isWeakSet(new WeakSet()); // Returns true