reactjs - Probleme la declarația tipului generic în TypeScript
Creez un hook numit useUpdate, am probleme la declararea tipului, codul este afișat mai jos
type CallBack<T extends readonly any[]> = (
...args: T
) => void | (() => void | undefined);
function useUpdate<T extends readonly any[]>(
callback: CallBack<T>,
deps: T
) {
const didMount = useRef(false);
const prevDeps = useRef(deps);
useEffect(() => {
if (!didMount.current) {
didMount.current = true;
return;
}
const clean = callback(...prevDeps.current);
prevDeps.current = deps;
return () => {
if (clean) {
clean();
}
};
}, deps);
}
când îl folosești, nu există nicio problemă dacă callback-ul are argumente, dar dacă nu se furnizează argumente pentru callback, tipul lui deps va fi incorect
const state: boolean = useSomethingElse(); // get changable data from anywere else
// OK, no type error
useUpdate((prevState) => {
console.log('I want to compare the current state and prevState', prevState, state);
},[state]);
useUpdate(() => {
console.log('I only care about the current state', state);
},[state]); // Type error occurs on this line, the message is:
// Argument of type '[boolean]' is not assignable to parameter of type '[]'.
// Source has 1 element(s) but target allows only 0.ts(2345)
Știu că este pentru că TypeScript setează T ca argumente ale callback-ului, care sunt [] dacă nu sunt furnizate argumente, dar există vreo modalitate ca TypeScript să folosească tipul lui deps și să sară peste tipul argumentelor callback-ului atunci când setează T?
Răspuns #1
Două moduri în care poți să rezolvi asta:
(1) Fă din deps primul parametru, astfel încât să înceapă prin a deduce T din deps
(2) Folosește un al doilea generic pentru callback:
function useUpdate<T extends readonly any[], Cb extends CallBack<T>>(
callback: Cb,
deps: T
) {
