
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
ts-type-guards
Advanced tools
Curried TypeScript type guards for primitive types and classes
Simplifies typechecking by providing type guards to check if something is of a certain type or of the same type as something else. Includes tailor-made type guards for the primitive types and a general one for "classy" types.
npm install ts-type-guards --save
import { is } from "ts-type-guards";
const header = document.querySelector("header");
console.log(header.textContent); // Error: Object is possibly 'null'.
if (is(HTMLElement)(header)) {
console.log(header.textContent); // Compiles and runs safely.
}
Because is, only etc are curried, you can use them like so:
import { is } from "ts-type-guards";
const foos = Array.from(document.querySelectorAll(".foo"));
const fooImages = foos.filter(is(HTMLImageElement));
const srcs = fooImages.map(img => img.src); // Compiles and runs safely.
Equivalent:
import { only } from "ts-type-guards";
const foos = Array.from(document.querySelectorAll(".foo"));
const fooImages = only(HTMLImageElement)(foos);
const srcs = fooImages.map(img => img.src); // Compiles and runs safely.
Use isLike to check if something is of the same type as a reference value:
import { isLike } from "ts-type-guards";
// We want to make sure that this function always returns a T:
function getFromLocalStorage<T>(key: string, fallback: T): T {
const saved: string | null = localStorage.getItem(key);
if (isNull(saved)) {
return fallback;
}
const parsed: any = JSON.parse(saved);
return (
isLike(fallback)(parsed)
? parsed // parsed is like fallback, so it is a T!
: fallback // parsed has wrong type, so return fallback.
);
}
getFromLocalStorage("volume", 50); // Guaranteed to be a number.
(Note that this function can still throw DOMException or SyntaxError, but that's not a typechecking problem.)
is is basically a partially applicable instanceof. For classy types, isLike(ref)(x) is equivalent to x instanceof ref.constructor.
class Animal {}
class Lion extends Animal {}
class Warthog extends Animal {}
const someone = new Animal();
const simba = new Lion();
const nala = new Lion();
const pumbaa = new Warthog();
is(Animal)(simba); // true
is(Lion)(simba); // true
is(Warthog)(simba); // false
is(Lion)(someone); // false
isLike(someone)(simba); // true
isLike(nala)(simba); // true
isLike(pumbaa)(simba); // false
isLike(nala)(someone); // false
is can only handle classy types, so the primitive ones have their own type guards:
isUndefined(undefined); // true
isNumber("5"); // false
isLike supports the primitive types as well:
isLike(5)(1.0); // true (because all numbers are floating point in JS)
isLike(null)(undefined); // false
The non-primitive types Boolean, Number and String share some, but not all, semantics with the primitive types boolean, number and string, respectively. The main difference lies in their equality semantics:
"foo" === "foo" ; // true
new String("foo") === new String("foo"); // false
ts-type-guards includes type guards for the cases when you don't care whether a value is of a primitive type or its pseudo-primitive counterpart. For example, to check if a value is either a string or a String, use isStringLike.
Although it may seem clunky to have to write is(x)(y) instead of is(x, y), this is a design choice based on the fact that partial application is so awesome. Not only does it get rid of xs.filter(x => is(T, x)) in favor of xs.filter(is(T)), it also lets you save and reuse type guards:
const isFoo = is(LongModuleName.Foo);
if (isFoo(x)) {
x.baz();
}
xs.filter(isFoo).forEach(x => x.baz());
You can check if something is an array of a certain type:
isArrayOfNumbers([1, 2, 3]); // true
isArrayOfNumbers([1, 2, "3"]); // false
isArrayOf(Error)([
new RangeError(),
new TypeError(),
]); // true
git checkout -b feature/foobar).git diff, then git add ...).git commit -m 'Add some foobar').git push origin feature/foobar).FAQs
Curried TypeScript type guards for primitive types and classes
The npm package ts-type-guards receives a total of 4,139 weekly downloads. As such, ts-type-guards popularity was classified as popular.
We found that ts-type-guards demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.