Я построил обработчик React с именем useValidation
, который проверяет набор переданных функций проверки с определенным значением. Параметр validators
является обобщенным типом c, поэтому я могу вернуть объект с теми же свойствами (проверенные функции проверки), но со значением true/false
в зависимости от того, что вернула функция проверки. Теперь я должен установить начальное состояние в хуке React
useState
. Я не могу понять, что типы правильно, хотя. Вот мой хук:
import { useState, useEffect } from "react";
export function useValidation<
K,
T extends {
[key: string]: (value: K) => boolean;
}
>(
value: K,
validators: T
): {
valid: boolean;
results: { [key in keyof T]: boolean };
} {
const [results, setResults] = useState<
{ [key in keyof T]: boolean }
>(??????);
useEffect(() => {
const newResults: {
[key in keyof T]: boolean;
} = Object.assign({}, results);
for (const key in validators) {
const valid = validators[key](value);
newResults[key] = valid;
}
setResults(newResults);
}, [results, validators, value]);
const valid = Object.values(results).every(
(item) => item === true
);
return { valid, results };
}
Я хочу установить все значения возвращаемого объекта в качестве начального значения, но как я могу выполнить то, что находится внутри хука useEffect
для начального значения. Я ищу такую функцию, которую затем могу вызвать внутри хука useState
и получить начальное значение:
function getInitialResults<
K,
T extends {
[key: string]: (value: K) => boolean;
}
>(
value: K,
validators: T
): { [key in keyof T]: true} {
const initialResults = {};
for (const key in validators) {
const valid = validators[key](value);
initialResults[key] = valid;
}
return initialResults;
}
Вот ссылка на TypeScript Playground , которая показывает ошибку Детская площадка