машинописное объединение с тегами в общем

Как сделать эту компиляцию без ошибок? Мы используем TypeScript 2.9.1.

interface IFoo {
  type: 'foo';
  foo: string;
}

interface IBar {
  type: 'bar';
  bar: string;
}

type FooBar = IFoo | IBar;

class Getter<T extends FooBar> {
  private data: T;

  constructor(data: T) {
    this.data = data;
  }

  public getMe(): string {
    const { data } = this;
    // Property 'foo' does not exist on type 'T'.
    // Property 'bar' does not exist on type 'T'.
    return data.type === 'foo' ? data.foo : data.bar;
  }
}

person Martin Ždila    schedule 12.06.2018    source источник
comment
И что это за ошибки?   -  person musefan    schedule 12.06.2018
comment
@musefan Они упоминаются в комментариях исходного кода непосредственно над затронутой строкой.   -  person Martin Ždila    schedule 12.06.2018


Ответы (1)


Компилятор не будет сужать переменные, которые имеют тип параметра типа. Вы можете ввести переменную явно и получить код для компиляции:

 public getMe(): string {
    const data :FooBar = this.data;
    return data.type === 'foo' ? data.foo : data.bar;
}
person Titian Cernicova-Dragomir    schedule 12.06.2018
comment
Похоже, что может быть решен в TypeScript 3.0. - person jcalz; 12.06.2018
comment
@jcalz Ага, похоже. Я пытался придумать, почему сужение было бы недействительным, и я не мог, похоже, это была просто нереализованная функция. - person Titian Cernicova-Dragomir; 12.06.2018
comment
@ TitianCernicova-Dragomir спасибо за ответ. К сожалению, мой пример был слишком упрощен по сравнению с тем, что мне действительно нужно. Не могли бы вы помочь мне с менее упрощенной версией на pastebin.com/dZvx9zSH? Как вы думаете, мне стоит опубликовать это как отдельный вопрос? - person Martin Ždila; 12.06.2018
comment
@ MartinŽdila Конечно, я могу взглянуть, но я только что ушла с работы, так что не будет на пару часов ... - person Titian Cernicova-Dragomir; 12.06.2018
comment
@ MartinŽdila, извините, я только сейчас нашел время взглянуть на ваш код, он не будет работать, потому что xxx и data не связаны с компилятором. Вот что вы можете попробовать: pastebin.com/N6twzSsp - person Titian Cernicova-Dragomir; 14.06.2018