Бих искал да имам базов клас със свойство, чийто тип се извежда от върнатата стойност на метода, който метод се изпълнява от низходящи класове.
И така, базовият клас може да бъде smg така:
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?