У меня есть следующий код в файле с именем 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< /а>
Буду рад любой помощи - извините за длинный пост!
new Storage<TemplateFunction>({})
это опечатка? Что такоеStorage
? - person jcalz   schedule 29.12.2019new Cacher<...
- person Ben Gubler   schedule 29.12.2019.ts
. Выполнил исправления в ссылке, которую вы разместили JIC, но не повезло - person Ben Gubler   schedule 29.12.2019