TypeScript возвращает объект с теми же свойствами, что и параметр generi c - PullRequest
0 голосов
/ 14 апреля 2020

Я построил обработчик 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 , которая показывает ошибку Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...