Получение свойства из экземпляра универсального класса с защитой типов

#typescript #typescript-generics

#typescript #typescript-generics

Вопрос:

Это достаточно просто, если тип не имеет значения, но я надеялся сохранить возвращаемый тип. Я пробовал это, но он просто говорит, что функция getData () возвращает «неизвестно».

Упрощенный пример:

 class DataHolder<DataType> {
  data: DataType;
  constructor(data: DataType) {
    this.data = data;
  }
}

function getData<U, T extends DataHolder<U>>(holder: T) {
  return holder.data;
}

let x = getData(new DataHolder<number>(10));
let y = x * 3; // error x is unknown
  

Ответ №1:

Вы используете слишком много дженериков. getData полиморфен только одним способом, поэтому ему нужен только один универсальный.

 function getData<T>(holder: DataHolder<T>): T {
  return holder.data;
}
  

В качестве альтернативы:

 function getData<T extends DataHolder<any>>(holder: T): T['data'] {
  return holder.data;
}
  

Оба будут работать, как ожидалось.