ParentType нельзя назначить типу T (который расширяет ParentType) - PullRequest
1 голос
/ 02 июня 2019

В моем приложении TypeScript я запрашиваю базу данных, чтобы получить некоторые данные.

Я построил свою собственную систему типов для отражения данных, поступающих из базы данных.

У меня есть функция getData(), и я уверен, что она всегда возвращает какой-то тип данных, который расширяет мой ParentDataType.

Затем существуют классы, которые должны получать данные различных типов, все они расширяются ParentDataType. В таких классах я хочу хранить данные внутри переменной типа T extends ParentDataType.

Но я получаю:

Ошибка TS2322: тип «ParentDataType []» не может быть назначен типу «T []».

Это мой код:

interface ParentDataType {
  [key: string]: string | number;
}

interface DataType1 extends ParentDataType {
  someKey: string;
}

interface DataType2 extends ParentDataType {
  someOtherKey: string;
}

class DataProvider {
  static getData(): ParentDataType[] {
    let data: ParentDataType[];

    // somehow gets the data from the DataBase ... and put it inside data
    // this data will always be an array of a type that extends ParentDataType

    return data;
  }
}

abstract class ParentClass<T extends ParentDataType> {
  rows: T[];

  onSomeEventTriggered() {
    this.rows = DataProvider.getData(); // Error TS2322: Type 'ParentDataType[]' is not assignable to type 'T[]'.
  }
}

class MyClass1 extends  ParentClass<DataType1> {
  // ...
}

class MyClass2 extends  ParentClass<DataType2> {
  // ...
}

1 Ответ

1 голос
/ 02 июня 2019

Внутри DataProvider.getData метода, который вы прокомментировали:

эти данные всегда будут массивом типа, который расширяет ParentDataType

Обратите внимание, что вы не говорите о самом ParentDataType, а о классе, который его расширяет - это не тот же тип. Вы должны сообщить об этом TypeScript и правильно ввести метод:

class DataProvider {
  static getData<T extends ParentDataType>(): T[] {
    let data: T[];

    // ...

    return data;
  }
}

Этот метод теперь также является универсальным, и поскольку TypeScript уже знает, что ваше свойство rows имеет тип T[], из этого следует, что DataProvider.getData() возвращает T[] в этом контексте.

...