Я хотел бы иметь базовый класс со свойством, тип которого определяется из возвращаемого значения метода, а этот метод реализуется дочерними классами.
Итак, базовый класс может быть таким:
abstract class MyBase<T> {
protected myProperty: T;
constructor() {
this.myProperty = this.getValueForMyProperty();
}
protected abstract getValueForMyProperty(): T;
}
И потомок:
class MyDescendant extends MyBase<MyDescendant1PropertyType> { // MyDescendant1PropertyType should be like ReturnType<(MyDescendant.getValueForMyProperty)>
protected getValueForMyProperty(): MyDescendant1PropertyType {
return {
prop1: "smg"
};
}
}
type MyDescendant1PropertyType = {
prop1
}
Теперь это работает, но при печати возникает много шума.
Я хотел бы описать правило:
Тип MyBase.myProperty
относится к типу MyDescendant.getValueForMyProperty
.
Мне не нужна информация о типе в MyBase
, только в MyDescendant
.
Итак, я хочу, чтобы smg выглядел так:
(Этот код не соответствует требованиям)
abstract class MyBase<T /*infer from below, don't want to type it in descendants*/> {
protected myProperty: ReturnType<getValueForMyProperty>; // Don't know the right syntax for this
constructor() {
this.myProperty = this.getValueForMyProperty();
}
protected abstract getValueForMyProperty(): T;
}
class MyDescendant extends MyBase { // Don't want to add the generic part, MyBase<anything>
protected getValueForMyProperty() { // Don't want to manually add return type
return { // Return type should be inferred
prop1: "smg"
};
}
}
Могу ли я сделать это в TypeScript?