Наследовать JSDoc из универсального параметра в TypeScript

#typescript #generics #jsdoc

#typescript #общие #jsdoc

Вопрос:

Я написал функцию-оболочку memoize , которая кэширует результаты функции по ее аргументам. Я бы хотел, чтобы подсказка типа для обернутой функции отображала исходные документы.

Вот что в настоящее время показывает подсказка типа:

Подсказка текущего типа

И вот как я объявил свой Memoized тип:

 /**
 * Functions that match this type can be memoized.
 */
type Memoizable = (...args: any[]) => any;

/**
 * The memoized function.
 */
interface Memoized<T extends Memoizable> {
    /**
     * Memoized function that caches its results by a key built from its arguments.
     */
    (...args: Parameters<T>): ReturnType<T>;
    /**
     * The cache from which memoized items are retrieved.
     */
    readonly cache: Map<string, ReturnType<T>>;
}
  

Поэтому вместо документации для Memoized я хочу показать документацию для моей функции test . Я предполагаю, что мне нужно объявить Memoized по-другому. Чего мне не хватает?

Просмотрите полный пример на TS Playground

Ответ №1:

Оказывается, решение состояло в том, чтобы объявить Memoized следующим образом:

 /**
 * Memoized function that exposes its cache.
 */
type Memoized<T extends Memoizable> = T amp; Memo<T>

/**
 * A memoized function exposes its cache as a read-only attribute.
 */
interface Memo<T extends Memoizable> {
    /**
     * The cache from which memoized items are retrieved.
     */
    readonly cache: Map<string, ReturnType<T>>;
}
  

Теперь подсказка типа выглядит следующим образом:

Подсказка правильного типа

Просмотрите полный пример на TS Playground