как набрать ссылку на функцию в машинописи - PullRequest
0 голосов
/ 01 марта 2019

Учитывая следующую функцию getCards - Как мне объявить тип для ввода memoize?Он принимает ссылку на функцию.

import memoize from "fast-memoize";

function getCards<T>(
  filterBy: string,
  CardsList: T[] = CardsJSON.map((item, i) => ({ ...item, id: i }))
) {
  return CardsList;
}

// This is what i've tried.
// const testType: Array<ICard> = getCards<ICard>("test");

const fn = memoize(getCards);

Я также получаю следующую ошибку типа для CardsList, и я не могу понять, что это за ошибка ..?

TS2322: Тип '{id: номер;spId ?: строка |не определено;callToAction ?: строка |не определено;cardTags ?: любой [] |не определено;campaignId: string;cardTitle: строка;cardDescription: строка;endAgeLimit ?: число |не определено;... еще 37 ...;updatedAt: строка;} [] 'нельзя назначить типу' T [] '.Тип '{id: номер;spId ?: строка |не определено;callToAction ?: строка |не определено;cardTags ?: любой [] |не определено;campaignId: string;cardTitle: строка;cardDescription: строка;endAgeLimit ?: число |не определено;... еще 37 ...;updatedAt: строка;} 'не присваивается типу' T '.

1 Ответ

0 голосов
/ 01 марта 2019

Полагаю, проблема в том, что компилятор не может гарантировать, что типы могут быть согласованы при вызове функции, рассмотрим следующий пример:

getCards<User>("name");

Здесь T явно установлено на User, нопо умолчанию список карт будет иметь значение Card & { id: number }, поэтому они не будут совпадать.


Я подумал, что это можно исправить, установив ограничение на параметр типа, подобное приведенному ниже, но, к сожалению, это не работает:

function getCards<T extends Card & { id: number }>

Это не совсем работает, потому что тип используется в качестве аргумента типа массива.Поэтому, если вы установите для T, например, SpecialCard со свойством bonus (не существует для типа Card), и вы получите элемент из списка карт по умолчанию, вы не получите объект типа SpecialCard, поскольку свойство будет отсутствовать.

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

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