我有一个泛型类,它获取一些接口作为类型参数,称为 DataType
。我知道传递的接口的所有字段都是可选的(但不知道如何通知 ts )所以我想用空对象初始化私有字段 data
,因为在开始时它总是空的,但可以填充一些值
class Basic<DataType extends {}> {
private data: DataType = {} // this line throws ts2322 error
}
class Man extends Basic<{ firstName?: string, age?: number }> {}
class Animal extends Basic<{ name?: string, isPet?:boolean }> {}
但得到一个错误ts2322
<块引用>类型“{}”不可分配给类型“DataType”。 “{}”是可分配的 'DataType' 类型的约束,但 'DataType' 可以是 使用不同子类型的约束“{}”进行实例化
这个问题能解决吗?
答案 0 :(得分:1)
这个具体问题是说虽然 DataType 满足 {}
,但反过来可能不是真的,因为您可以将泛型实现为符合 {}
(对象)约束的东西,但属于一种不同的类型。例如,如果您有 DataType
的类型为 { firstName: string }
,您将无法将 {}
分配给它。 TypeScript 这样做是为了类型安全……无法提前知道泛型类型是否与 {}
不兼容。
看来您真正想要的是 data
不属于 DataType
,而是与 DataType
兼容,但所有属性都是可选的。这可以通过 Partial
类型实现:
private data: Partial<Datatype> = {};