Создайте функцию с типом generi c на машинописном тексте - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы преобразовать эту функцию с помощью generi c type

const entities = toppings.reduce(
    (entities: { [id: number]: Topping }, topping: Topping) => {
      return {
        ...entities,
        [topping.id]: topping,
      };
    },
    {
      ...state.entities,
    }
  );

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Вы пытаетесь сделать такую ​​функцию?

// TypeScript needs to know that the generic type you are passing has at least the id property
// and that the id property is something you can use as an object key
const process = <T extends { id: string | number }>(
  values: T[],
  // I made it so that you don't need to pass the original entities (state.entities) in your code
  // and for that I need to tell TypeScript that the default value of {} is a map of entities by id
  existingEntities: Record<T['id'], T> = {} as Record<T['id'], T>,
): Record<T['id'], T> => {
  return values.reduce(
    (entities, value: T) => ({
      ...entities,
      [value.id]: value,
    }),
    existingEntities,
  );
};
0 голосов
/ 26 мая 2020

Если вы хотите определить reduce, используйте toppings.reduce<Record<number, Topping>>.

Если вы хотите определить сам обратный вызов или придерживаться Topping, тогда выполните <T extends Topping = Topping>.

const entities = toppings.reduce(
    <T = Topping>(entities: { [id: number]: T}, topping: T): Record<number, T> => {
      return {
        ...entities,
        [topping.id]: topping,
      };
    },
    {
      ...state.entities,
    }
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...