我正在使用Ionic v6和Angular构建一个应用程序,使用Firebase Firestore作为云数据存储。我已经定义了一个带有'Date'对象的接口:
export interface PuzzleInfo {
puzzleAnswers: string[];
puzzleTitle: string;
deployed: boolean;
deployDate: Date;
status?: string;
}
当数据被写入Firestore时,它被“转换”为[秒,纳秒]的时间戳类型。然后,当我将数据读回同一个对象定义时,'deployDate'不能作为Date类型使用;一个控制台日志显示'无效日期',我不能在上面使用任何日期方法/函数。即使数据类型是“Date”,从DB输入的项目的实际内容对于Date无效。
我创建了一个模仿Firestore数据类型的Timestamp接口
export interface Timestamp {
seconds: number;
nanoseconds: number;
}
然后,在我的TS代码中,我将传入的对象转换/转换为timestamp对象,然后再转换回日期:
public puzzle: PuzzleInfo[]
<< read data from Firestore >>
const fbTimestamp = this.puzzle.deployDate as unknown as Timestamp;
this.depDate = new Date(fbTimestamp.seconds * 1000).toISOString();
这给了我在const fbTimestamp中所需要的内容,然后我就可以只访问一个Date中的秒部分。有没有更简单/更好的方法来做到这一点?我没有直接将Date对象转换为FB Timestamp对象;我可以告诉FB为我做了这些。有没有办法阻止这种转变?我知道我可以将deployDate设置为字符串,并将其作为字符串存储在DB中,然后来回转换。
虽然这是可行的,但它确实看起来非常复杂,在未来容易出错。
想法?
1条答案
按热度按时间db2dz4w81#
有没有更简单/更好的方法来做到这一点?
以你现在定义数据的方式,不是真的。数据类型转换在数据库中非常常见。这并不像你想象的那么糟糕--你肯定会在应用程序的其他部分遇到更困难和更有问题的事情。只需编写一个数据转换器函数,并在需要时使用它。如果你对功能进行了单元测试,就不容易出错。Firestore甚至有一个TypeScript API来实现这一点:FirestoreDataConverter。
有没有办法阻止这种转变?
不完全是,只要你使用的是Date对象。如果你的代码中一定要有一个Date对象,那么每次你想读写的时候,你都要转换它。你可能会有一个更好的时间使用一个数字,而不是日期,然后转换该数字只有当你绝对需要从它派生的其他东西。如果你计划得好,你甚至可能根本不需要约会。
对于日期类型使用字符串通常是一个坏主意,除非您希望提交到具有方便转换器的ISO格式。