Почему TypeScript жалуется при назначении литерала объекта обобщенному литералу объекта типа c? - PullRequest
1 голос
/ 06 апреля 2020

Я не понимаю, почему компилятор TypeScript жалуется на этот код:

import { useState, useEffect } from 'react';

function useSomething<T extends { [key: string]: any }>(): T {
  const [state, setState] = useState<T>({});  // Argument of type '{}' is not assignable to parameter of type 'T | (() => T)'.

  useEffect(() => {
    setState({ hello: 'world' });
  });

  return state;
}

Поскольку в основном этот код работает: const t: { [key: string]: any } = { hello: 'world' }.

Пример игровой площадки: https://www.typescriptlang.org/play/?ssl=14&ssc=36&pln=14&pc=52#code / JYWwDg9gTgLgBAbzgVwM4FMDKMCGN0A0KGAogGZnoDG8AvnGVBCHAORTo42sDcAUHzLIAdjWARhxLM3QwAFsGEBzADwAVOOgAe + YQBNUiOAG0A1ugCeALjioYURUoC6NnMItxaAPgAUAShsNBD44OCoJOxM7PEJb WWwYpzgAXikE-HVfBFo-fhCpckoaH38Ur0R80IwYdPQfJDl0ABsmiBtWAHdoJr1WT1z8nLzQjhhkKElo-H5aAT5w4UiYGyQzSxs7B2UXODcPelTs-gWlgCYVk3NrW3tHHb3PFKNGlra2LqgevtoeIA

1012 * EDIT : лучший пример, вопрос в основном, можно ввести это в машинописном 1016? *

Несколько комментариев о коде:

  • Я хочу, чтобы T всегда был объектом {}, поэтому никто не должен делать useComplexState<boolean>
  • В идеале T не требуется, поэтому, если я использую useComplexState(), у меня должен быть просто c объект Record<string, any> внутри.
  • Я хотел бы иметь значение по умолчанию {} для state.

1 Ответ

0 голосов
/ 07 апреля 2020

Добавление as T в useState<T>({} as T) исправляет каждую проблему.

...