带有空对象的变量初始化问题

时间:2020-12-30 19:05:54

标签: typescript

我有一个泛型类,它获取一些接口作为类型参数,称为 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' 可以是 使用不同子类型的约束“{}”进行实例化

这个问题能解决吗?

1 个答案:

答案 0 :(得分:1)

这个具体问题是说虽然 DataType 满足 {},但反过来可能不是真的,因为您可以将泛型实现为符合 {}(对象)约束的东西,但属于一种不同的类型。例如,如果您有 DataType 的类型为 { firstName: string },您将无法将 {} 分配给它。 TypeScript 这样做是为了类型安全……无法提前知道泛型类型是否与 {} 不兼容。

看来您真正想要的是 data 不属于 DataType,而是与 DataType 兼容,但所有属性都是可选的。这可以通过 Partial 类型实现:

private data: Partial<Datatype> = {};