created: 2024-04-22T09:25:23.454Z

type-fest の RequireAllOrNone

型ユーティリティライブラリの type-festRequireAllOrNone の使い方。

RequireAllOrNone

この実装だとresponder3 だけ型エラーになる。

import type { RequireAllOrNone } from "type-fest";

type Responder = {
  text?: () => string;
  json?: () => string;
  secure: boolean;
};

// text,json どちらも持たないのでOK
const responder1: RequireAllOrNone<Responder, "text" | "json"> = {
  secure: true,
};

// text,json どちらも持ってるのでOK
const responder2: RequireAllOrNone<Responder, "text" | "json"> = {
  text: () => '{"message": "hi"}',
  json: () => '{"message": "ok"}',
  secure: true,
};

// text,json 片方だけもってるのでNG
const responder3: RequireAllOrNone<Responder, "text" | "json"> = {
  json: () => '{"message": "ok"}',
  secure: true,
};

エラーメッセージ

Type '{ json: () => string; secure: true; }' is not assignable to type 'RequireAllOrNone<Responder, "text" | "json">'.
  Type '{ json: () => string; secure: true; }' is not assignable to type 'Required<Pick<Responder, "text" | "json">> & Omit<Responder, "text" | "json">'.
    Property 'text' is missing in type '{ json: () => string; secure: true; }' but required in type 'Required<Pick<Responder, "text" | "json">>'

仲間

RequireAllOrNone には仲間がいる。

その他

type-fest のドキュメント、弾いてくれる例も書いたらいいのにな、と思う。

サイバーセキュリティの教科書
[ad] サイバーセキュリティの教科書
Thomas Kranz, Smoky (単行本(ソフトカバー))