🔧
isXXX を簡単に構築してみいひん?
みなさん、こんにちは!もうそろそろ紅葉の季節ですね 🍁
フロントエンドエンジニアの @nyaomaru です!
🧪 きっかけ
TypeScript で開発していると、「value is Foo」っていう型ガードを何度も何度も手書きしてるな… と思うことあらへん?
しかも、型とランタイムの判定がズレないように神経をすり減らすのも、地味にストレス。
そこで登場するのが is-kit や!

軽量・ゼロ依存の 「ガード生成キット」 として、退屈な boilerplate を一刀両断やで ✂️
🎁 なんで is-kit?
- 🖋 退屈な
value is Fooの手書き卒業- →
defineやpredicateToRefineでガード定義を一元化
- →
- ⚙️
and/or/notでロジックを合成- → ドメイン固有の複雑条件も宣言的に表現。
- 🧩
struct/array/tupleなどのコンビネータ- → ネストしたオブジェクト検証も数行で完了。
- ✅ ランタイム+型テストの二重保証
- →
Jest+tsdによる型推論テストで安心。
- →
🔎 どうやって使うの?
例えば、実務でよくある「空文字ではない string を判定したい」とき、こうやって書く。
import { define, isString } from 'is-kit';
const isNonEmptyString = define<string>(
(value) => isString(value) && value.length > 0
);
isNonEmptyString('foo'); // true
isNonEmptyString(''); // false`;
generics に型を渡すことで、「type predicate(型述語/型ガードシグネチャ)」なしで宣言できるから、シュッとするなぁ~!
他にも例えば、実務でよくある「ユーザーの型を特定したい」とき、こうやって書く。
import { struct, isString, isNumber, safeParseWith } from 'is-kit';
const isUser = struct({ id: isNumber, name: isString });
isUser({ id: 1, name: 'A' }); // true
const parseUser = safeParseWith(isUser);
const result = parseUser({ id: 'abc', age: 42 });
// result.valid === true
if (result.valid) {
// 成功時の処理
} else {
// 失敗時の処理
}
API からの response や form の入力値が、要件を満たす型かどうかを型安全にチェックできるんや!
他にも例えば、もっと複雑な条件を組み合わせるときには、こうやって書く。
import { and, or, not, predicateToRefine, isString, isNumber } from 'is-kit';
const isLongLiteral = predicateToRefine<string>((value) => value.length > 3);
const isLongString = and(isString, isLongLiteral);
isLongString('abcd'); // true
isLongString('ab'); // false
isLongString(123 as unknown); // false
or(isString, isNumber)('foo'); // true
not(isString)(123); // true`;
組み合わせ次第で色んな型ガードを表現できるんや!
primitive や object の型を判定する型ガードも用意してるから、きれいに型ガードが書けるで~!
🌱 配布とエコシステム
npm 経由で install できるで~!
pnpm add is-kit
# or
bun add is-kit
# or
npm i is-kit
# or
yarn add is-kit
Deno や Bun を使って、JSR 経由で typescript のまま利用することもできるで~!
import { struct } from 'jsr:@nyaomaru/is-kit';
🎯 まとめ
is-kit は「TypeScript で安全にガードを書く」ためのシンプルなキット。
-
defineで小さく -
structで大きく -
and/or/notで組み合わせ -
safeParseで使いやすく
型とランタイムのズレに悩んでいるなら、一度プロジェクトに入れてみてな! 🚀
ほんで気に入ったら 🌟 つけてってなぁ~!😻
Discussion