Вы ищете "polymorphi c this
for stati c members", а он в настоящее время не является частью языка TypeScript. Возникла проблема с GitHub по адресу microsoft / TypeScript # 5863 . Это давняя нерешенная проблема, и я не вижу явных признаков того, что она когда-либо будет реализована или когда. К счастью, в этой проблеме упоминаются некоторые обходные пути, которые могут вам подойти:
В методе stati c this
относится к типу конструктора класса, а не к типу его экземпляра. Вместо использования типа polymorphi c this
вы можете использовать общий c this
параметр :
public static async findByID<T extends Model>(
this: { prototype: T }, id: string
) {
const thiz = this as any as typeof Model;
const query =
`select ${thiz.columns} from ${db.name}.${thiz.TableName} where ${thiz.Columns[0]}='${id}'`
return (await db.query(query) as T[])[0]
}
Здесь мы говорим, что для call findById()
, вам нужно вызвать его как метод объекта со свойством prototype
generi c type T
. В TypeScript свойство prototype
конструкторов классов имеет тип экземпляра класса (несмотря на то, что это технически не соответствует действительности во время выполнения), поэтому, если у вас есть class Foo extends Model {...}
, то Foo.findById()
приведет к тому, что T
будет выведено как Foo
. Таким образом, вы можете рассматривать T
как тип экземпляра конструктора подкласса. И findById()
возвращает значение типа Promise<T>
.
Обратите внимание на то, что, когда вы используете параметр this
, вы переопределяете предполагаемый неполиморфный тип c this
, то есть typeof Model
. И, к сожалению, нет возможности получить доступ к методам и свойствам protected
из общего c this
. Поэтому я работаю над этим, делая значение thiz
внутри findById()
идентичным значению this
и вручную утверждая, что оно имеет typeof Model
, чтобы вы могли получить доступ к columns()
, Columns
и TableName
.
Давайте убедимся, что это работает:
class SubModel extends Model {
submodelProp = "foo"
}
SubModel.findByID("hello").then(s => s.submodelProp.toUpperCase())
Мне нравится ... SubModel.findById()
возвращает Promise<SubModel>
, о чем свидетельствует тот факт, что вы можете получить доступ его свойство submodelProp
.
Хорошо, надеюсь, что это поможет; удачи!
Детская площадка ссылка на код