外からやってくるjsonデータを検査する関数を型から自動生成するものです。
npm i -D ts-auto-guard
型を記述してあるファイル名を指定して実行
npx ts-auto-guard --export-all src/types/post.ts
同じフォルダに Post.guard.ts という名前で 自動生成されます。
Tanstack Query や RTK Query などに組み込みます。
ガードを実行する関数を作成します
/**
* レスポンスを検査するガード関数を作成して返す。
* - developmentの場合は受け取ったガード関数を実行する関数を返す
* - development以外の場合は何も作成せずundefinedを返す
*/
function createValidateResponseType<T>(
guardFunc: (response: unknown) => response is T,
): ((response: unknown) => T) | undefined {
if (process.env.NODE_ENV !== 'development') {
return undefined;
}
return (response: unknown): T => {
if (guardFunc(response)) {
return response;
}
throw new Error(
`バリデーションエラー。受け取ったデータが(${guardFunc.name})関数にマッチしません。オブジェクトのプロパティの命名と型を確認してください。`,
);
};
}
selectオプションで実行します
import { isPost } from '@/types/post.guard';
const useDataQuery = () => {
return useQuery({
queryKey: ['data'],
queryFn: fetchData,
// データ受信後にバリデーションを実行する
select: createValidateResponseType(isPost),
});
};
transformResponseオプションで実行します
import { isPost } from '@/types/post.guard';
export const myApi = createApi({
........
endpoints: (builder) => ({
getPost: builder.query<Post | null, void>({
query: (): FetchArgs => ({
url: '/post',
}),
// データ受信後にバリデーションを実行する
transformResponse: createValidateResponseType(isPost),
}),
}),
vi .eslintignore
例:
src/common/api/*.guard.ts