🔧

isXXX を簡単に構築してみいひん?

に公開

みなさん、こんにちは!もうそろそろ紅葉の季節ですね 🍁

フロントエンドエンジニアの @nyaomaru です!

🧪 きっかけ

TypeScript で開発していると、「value is Foo」っていう型ガードを何度も何度も手書きしてるな… と思うことあらへん?

しかも、型とランタイムの判定がズレないように神経をすり減らすのも、地味にストレス。

そこで登場するのが is-kit や!

is-kit logo

https://github.com/nyaomaru/is-kit

軽量・ゼロ依存の 「ガード生成キット」 として、退屈な boilerplate を一刀両断やで ✂️

🎁 なんで is-kit?

  • 🖋 退屈な value is Foo の手書き卒業
    • definepredicateToRefineガード定義を一元化
  • ⚙️ 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`;

組み合わせ次第で色んな型ガードを表現できるんや!

primitiveobject の型を判定する型ガードも用意してるから、きれいに型ガードが書けるで~!

🌱 配布とエコシステム

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