ParentType不可分配给类型T(扩展了ParentType)

时间:2019-06-02 11:49:20

标签: typescript types typescript-typings typescript-generics typescript3.0

在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 个答案:

答案 0 :(得分:1)

您在DataProvider.getData方法内进行了评论:

  

此数据将始终是扩展ParentDataType的类型的数组

请注意,您在这里不是在谈论ParentDataType本身,而是在扩展它的类—它们不是同一类型。您必须告知TypeScript并正确键入方法:

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

    // ...

    return data;
  }
}

该方法现在也是通用的,并且由于TypeScript已经知道您的rows属性为T[]类型,因此它将推断DataProvider.getData()在该上下文中返回T[]