У меня есть следующие trait
и classes
в Scala
:
sealed trait Algorithm {
val name: String
val formula: String
val parameters: Seq[AlgorithmParameter[Any]]
def enhanceAlgorithm[T](algorithm: T): Unit
}
case class LinearRegressionAlgorithm(override val name: String, override val formula: String) extends Algorithm {}
case class GeneralizedLinearRegressionAlgorithm(override val name: String, override val formula: String) extends Algorithm {}
sealed abstract class AlgorithmParameter[+T](val name: String, val value: T, val selectOptions: Seq[T]) extends EnumEntry
object AlgorithmParameter extends Enum[AlgorithmParameter[AnyVal]] with CirceEnum[AlgorithmParameter[AnyVal]] {
case object MaxIter extends AlgorithmParameter[Int]("maxIter", 100, Seq())
}
Я создал в TypeScript
соответствующие классы, которые выглядят так:
export abstract class Algorithm {
readonly name: string;
readonly formula: string;
readonly parameters: AlgorithmParameter<any>[];
protected constructor(name: string, formula: string, parameters: AlgorithmParameter<any>[]) {
this.name = name;
this.formula = formula;
this.parameters = parameters;
}
}
export class LinearRegressionAlgorithm extends Algorithm {}
export class GeneralizedLinearRegressionAlgorithm extends Algorithm {}
export class AlgorithmParameter<T> {
readonly name: string;
readonly value: T;
readonly selectOptions: T[];
constructor(name: string, value: T, selectOptions: T[]) {
this.name = name;
this.value = value;
this.selectOptions = selectOptions;
}
}
Я делаю REST-запрос к бэкэнду (часть Scala), который возвращает последовательность типа Seq[Algorithm]
, и я ожидаю, что ответ будет правильно переведен в классы Typescript, но это не так
Метод REST выглядит следующим образом:
recommend<T extends Algorithm>(body: RecommenderRequest): Observable<T[]> {
return this.http.post<T[]>(environment.baseUrl + this.recommenderPath + this.algoRecommendationsPath, JSON.stringify(body))
.catch((error: any) => Observable.throw(error.json().error || 'Server error'))
}
Ответ переводится в массив, выглядящий следующим образом:
Кажется, что TS algorithm-objects
были созданы, но они инкапсулированы внутри другого объекта, и я не могу получить к ним доступ простым способом
Чтобы получить name
первого алгоритма, вызов выглядит следующим образом:
response[0].LinearRegressionAlgorithm.name
, но я бы хотел, чтобы массив Http-response создавался таким образом, чтобы можно было просто написать response[0].name