TypeScript: аннотировать общий класс ES5

У меня есть следующий код в файле с именем storage.ts. Его цель — служить устройством хранения для нескольких частей моего API.

interface ICache<T> {
  [key: string]: T
}

declare class Cacher<T> {
  constructor (initialCache: ICache<T>)
  define (key: string, val: T): void
  get (key: string): T
  remove (key: string): void
  clear (): void
  load (cacheObj: ICache<T>): void
}

function Cacher<T> (this: any, initialCache: ICache<T>) {
  var cache: ICache<T> = initialCache
  this.define = function (key: string, val: T) {
    cache[key] = val
  }
  this.get = function (key: string) {
    if (cache[key]) {
      return cache[key]
    } else {
      throw new Error ("Key '" + key + "' doesn't exist")
    }
  }
  this.remove = function (key: string) {
    delete cache[key]
  }
  this.clear = function () {
    cache = {}
  }
  this.load = function (cacheObj: ICache<T>) {
    cache = cacheObj
  }
}

export default Cacher

Пример использования (containers.ts):

import Cacher from './storage'
type TemplateFunction = (options: object, config: object) => string

var Templates = new Cacher<TemplateFunction>({})

Все отлично и отлично, VSCode и TSLint не выдают никаких ошибок и т. д., пока я не попытаюсь собрать с помощью TypeDoc. Затем containers.ts выдает эту ошибку:

«новое» выражение, цель которого не имеет сигнатуры конструкции, неявно имеет тип «любой».

и storage.ts выдает эту ошибку дважды, в строке 6 и 15:

Дублирующийся идентификатор «Кэшер»

Я мог бы подумать, что это просто проблема с TypeDoc, но изменение function Cacher<T> (this: any, initialCache: ICache<T>) { на export default function Cacher<T> (this: any, initialCache: ICache<T>) { и удаление последней строки дает эту ошибку:

Объединенная декларация «Кэшер» не может включать экспортную декларацию по умолчанию. Вместо этого рассмотрите возможность добавления отдельного объявления «экспортировать кэш по умолчанию». ts(2652)

Я потратил часы, пытаясь исправить это. Я пробовал несколько различных вариантов этого StackOverflow answer, но он не позволяет передавать общий. Кроме того, я нахожу let x = function() менее элегантным, чем function x().

Случайные заметки:

  • Я заменил this: any на this: [an interface that represents this]. Та же проблема, что и раньше
  • По причинам, в которые я бы не хотел вдаваться, я не хочу преобразовывать его в класс
  • Возможно, связано с этой ошибкой: https://github.com/microsoft/TypeScript/pull/3973< /а>

Буду рад любой помощи - извините за длинный пост!


person Ben Gubler    schedule 29.12.2019    source источник
comment
new Storage<TemplateFunction>({}) это опечатка? Что такое Storage?   -  person jcalz    schedule 29.12.2019
comment
@jcalz ой, опечатка. Он должен был сказать new Cacher<...   -  person Ben Gubler    schedule 29.12.2019
comment
Похоже, что один и тот же файл включается несколько раз (или, возможно, включаются файл ts и его вывод js). Возможный дубликат запутанного сообщения об ошибке Typescript "дубликат идентификатора"   -  person jcalz    schedule 29.12.2019
comment
@jcalz возможно. Однако ошибки находятся в разных строках и происходят из файлов .ts. Выполнил исправления в ссылке, которую вы разместили JIC, но не повезло   -  person Ben Gubler    schedule 29.12.2019