在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> {
// ...
}
答案 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[]
。