У нас есть базовый класс StoreObject
, который предоставляет общие методы преобразования/лечения и т. д. для объектов, сохраняемых в БД. Я хотел бы иметь возможность указывать более строгие типы возврата из этих методов с помощью дженериков. Однако мои попытки приводят к ошибкам при сравнении typeof StoreObject
с typeof AClassThatExtendsStoreObject
, проверка, которую мы делаем в различных служебных функциях. Можете ли вы указать мне направление того, что я делаю неправильно ниже?
class StoreObject<S> {
toStoreObject(s: S): S {
// Perform some sanitisation etc.
return s;
}
}
interface Fact {
id: string;
fact: string;
}
// A concrete implementation of StoreUnit where we attempt to define the actual model of the object being stored
class FactStoreObject extends StoreObject<Fact> {}
// We've got some general utils that interact objects using these classes
// These typicallay take a concrete implementation of StoreUnit to be used as a parser/processer
function doSomething(StoreObjectClass: typeof StoreObject) {
// Typically:
// const parsedObject = new StoreObjectClass(someObject).toStoreObject()
// persistToDb(parsedObject)
}
// This errors with "Type 'S' is not assignable to type 'Fact'"
doSomething(FactStoreObject);
doSomething()
общим?FactStoreObject
не может создавать общие экземплярыStoreObject<S>
... он может создавать только экземплярыStoreObject<Fact>
. - person jcalz   schedule 08.07.2019