Я пытаюсь создать библиотеку ORM, похожую на Entity Framework, для node.js и MongoDB с помощью TypeScript.
С помощью этой библиотеки потребитель сможет определить класс Model (например, Person
), который будет расширять класс Base
, а декоратор класса добавит дополнительные данные в класс Person (дляпример, массив instances
, который будет содержать все экземпляры модели, и collection_name
, который будет именем коллекции MongoDB для модели и т. д.).
код в площадка TypeScript .
Итак, моим первым шагом было создание класса Base
:
class Base<T>
{
static collection_name: string
static instances: Base<any>[]
_id: string
}
Чтобы пользователь мог определить свою модель следующим образом:
@decorator<Person>({collection_name: 'people'})
class Person extends Base<Person>
{
@field name
@field address
...
}
затем я создал класс декоратора для установки свойств collection_name
и instances
класса Person:
function decorator<T>(config: { collection_name: string }) {
return function <T extends Base<T>>(Class: IClass<T>) {
Class.collection_name = config.collection_name;
Class.instances = [];
return Class
}
}
функция декоратора получает сгенерированный пользователем Class
, и я пытаюсьсоздать интерфейс, который будет описывать тип такого класса.Я назвал его IClass
:
interface IClass<T>
{
new(): Base<T>
instances: Base<T>[];
collection_name: string
}
new
- это конструктор (который возвращает Base
экземпляр) instances
и collection_name
- статические свойстваиз Base<T>
и здесь не являются статичными (я не уверен в этом, верно?)
Однако при попытке определить пользовательскую модель я получаю следующую ошибку:
@decorator<Person>({collection_name: 'people'}) // <==== ERROR HERE ===
class Person extends Base<Person>
{
}
Ошибка: (23, 2) TS2345: Аргумент типа 'typeof Person' не может быть назначен параметру типа 'IClass>'.
Свойство 'instances' отсутствуетв типе 'typeof Person', но в типе 'typeof Person' отсутствуют следующие свойства из типа, требуемого для типа 'IClass>'.
Кажется, что компилятор машинописного текста игнорирует статические члены, унаследованные от Base
при проверке типа typeof Person
.
Как определить тип свойства Class функции decorator?