👻

Re: jotaiのuseAtom()で更新関数の型がnever

2024/02/09に公開

https://qiita.com/choco227/items/cd6a61a9a4fc0ab7e69f

これ、以前から時折質問されていて、型推論に任せるか、

const [loading, setLoading] = useAtom(loadingState);

3引数とも書くか、

const [loading, setLoading] = useAtom<boolean, [SetStateAction<boolean>], void>(loadingState);

してくださいと回答していたのですが、確かに分かりにくいですね。

もしかしたら、もう一つオーバーロードすればできるかもと、ちょっと試してみました。
https://tsplay.dev/w6eaGW

import { atom, useAtom as useAtomOrig, useAtomValue } from "jotai";
import type { Atom, PrimitiveAtom, SetStateAction, WritableAtom } from "jotai";

const countAtom = atom(0);

const [countOrig, setCountOrig] = useAtomOrig<number>(countAtom);
//                ^? const setCountOrig: never

type SetAtom<Args extends unknown[], Result> = (...args: Args) => Result;

type Options = Parameters<typeof useAtomValue>[1];

declare function useAtom<Value, Args extends unknown[], Result>(
  atom: WritableAtom<Value, Args, Result>,
  options?: Options,
): [Awaited<Value>, SetAtom<Args, Result>];

declare function useAtom<Value>(
  atom: PrimitiveAtom<Value>,
  options?: Options,
): [Awaited<Value>, SetAtom<[SetStateAction<Value>], void>];

declare function useAtom<Value>(
  atom: Atom<Value>,
  options?: Options,
): [Awaited<Value>, never];

const [count, setCount] = useAtom<number>(countAtom);
//            ^? const setCount: SetAtom<[SetStateAction<number>], void>

できました。プルリクエスト作ろうっと。

Jotai Friends

Discussion