🔧
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