Привести тип объекта к другому типу - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть класс, в котором я устанавливаю тип range на IntervalRange

export class Test {range: IntervalRange;}

, затем в родительском классе я инициализирую значение:

export class TestInitializer {
Create(){
    return <Test>{
        range: IntervalRange.initialize(Database.GetByName('MONTH').id};
}

InitializeElement() {
  let test = <Test>JSON.parse(JSON.stringify(configuration));
  return test;
}

, затем в другом компонентеЯ использую это как:

@Input() range: IntervalRange;

Однако на функции range.getRange(); я получаю: ERROR TypeError: this.range.getRange is not a function

Почему это так?он говорит, что range является объектом, хотя это должно быть IntervalRange.

Я пытался написать as IntervalRange, <IntervalRange> range ничего не получалось.Как это исправить?

Обновление: let type = typeof(this.range);отпечатки "object"

метод:

ngOnChanges() {
if (this.range) {
  let type = typeof(this.range);
  let ddd = this.range.getRange(); //<----- this is where I get error
}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

TypeScript «cast» (<A>tmp или tmp as A):

  • выполняет проверку совместимости структурного типа → он недоступен, если исходные данные имеют тип any.
  • не имеет аналога времени выполнения → Типы TypeScript могут быть совместимы, но типы времени выполнения могут различаться, например, литерал объекта и экземпляр реального класса.

Когда данные поступают из небезопасного / внешнего источника, напримерJSON.parse () или WebAPI-вызов, это DTO (объект передачи данных) с типом any.«Приведение» TypeScript также небезопасно.

Чтобы обеспечить операцию приведения, вы можете использовать функцию отображения из DTO в класс «модель домена».Ключевым моментом является возвращение экземпляра реального класса.

  • Object.assign(new IntervalRange(), this.range) (что вы упомянули в комментарии) удовлетворяет этому пункту.
  • Мы можем бытьеще более строгим становится «отображение по полю»: this.a = range.a; this.b = range.b; ...).

Обе опции лучше заключены в функции: конструктор класса, метод статической фабрики в классе, внешняя функция втот же модуль.

0 голосов
/ 12 февраля 2019

Типовое преобразование приводит только к типу.Typescript не существует во время выполнения.Поэтому, если JSON.parse не возвращает правильный экземпляр Test (чего не будет, поскольку методы не будут сериализованы), он потерпит неудачу во время выполнения.Вместо приведения типов вы, вероятно, захотите создать экземпляр Test и загрузить в него сериализованные данные.

...