空对象的变量初始化问题[重复]
Posted
技术标签:
【中文标题】空对象的变量初始化问题[重复]【英文标题】:Problem with variable initialization with empty object [duplicate] 【发布时间】:2021-04-07 06:31:47 【问题描述】:我有一个泛型类,它获取一些接口作为类型参数,称为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”可能是 使用不同子类型的约束“”进行实例化
这个问题能解决吗?
【问题讨论】:
你应该看看 TypeScript 的实用程序类型:typescriptlang.org/docs/handbook/utility-types.html 为什么你认为你需要在Basic
里面初始化data
? (提示:你没有)
有over 1000 questions which mention TS2322。请至少浏览一对夫妇并说出为他们提供的答案如何不符合您的问题。
@Dai,我应该在哪里初始化一个班级成员?课外?我听说 typescript 与 javascript 不同,但到目前为止还没有想到
请阅读How to Ask。第一部分的标题是“搜索和研究……”我不认为在要求别人做同样的事情之前要求人们做一些研究并尝试回答他们自己的问题是傲慢的。另请参阅常见问题解答How much research effort is expected of Stack Overflow users?
【参考方案1】:
这个特定的问题是说虽然 DataType 满足 ,但反过来可能不正确,因为您可以将泛型实现为符合
(对象)约束的东西,但属于不同类型。例如,如果
DataType
的类型为 firstName: string
,则无法将 分配给它。 TypeScript 这样做是为了类型安全...无法提前知道泛型类型是否与
不兼容。
看来您真正想要的是data
不是DataType
,而是与DataType
兼容,但所有属性都是可选的。这可以通过Partial
类型来实现:
private data: Partial<Datatype> = ;
【讨论】:
你知道你可以编辑你的答案,对吧?没必要删掉答案再写一个全新的…… 有趣,谢谢,但是有没有办法检查可能是使用js代码,DataType的所有属性都有问号,这意味着它们是可选的? @DmitryReutov 可选属性与类型/TypeScript 严格相关。在 JavaScript 中,所有属性都是可选的。请注意,由于Partial
的工作方式,您为DataType
声明的任何属性是否是可选的并不重要。 Partial
将使它们成为可选的。
@ExplosionPills,好的,我会研究更多的 abot Partial 以了解它是解决方案还是更好地分配为 data = as DataType
@DmitryReutov 这些是不同的方法;如果你强制转换,那么如果属性不是可选的,TypeScript 将不会警告你。例如,data.property
可能未定义,因此data.property.subproperty
将是运行时错误。 Partial
方法会警告您 data.property
在类型检查期间可能未定义。以上是关于空对象的变量初始化问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章