我有一个使用 redux 和 redux-persist 的 Typescript 项目。是否可以使用 Typescript 进行 redux-persist 迁移配置?主要困难归结为:如果你有一个 Typescript 类型的根 redux 状态,它通常/总是代表你的状态的最新版本(不一定是以前持久的)。在迁移的上下文中,您如何表示以类型方式从持久性中读取的数据,知道它与您的状态的最新版本不匹配?一些细节:
这是用于数据迁移的 redux-persist 的 Typescript API:
export interface MigrationManifest {
[key: string]: (state: PersistedState) => PersistedState;
}
export interface PersistedState { _persist?: PersistState }
export interface PersistState { version: number; rehydrated: boolean; }
有意义的是,您提供的MigrationManifest
键是版本号,值是接收持久状态并返回新持久状态的函数。由于PersistedState
只是一个接口,因此您似乎可以拥有一种传入类型并返回另一种类型(在您的数据架构发生更改的情况下)。
所以假设我有以下类型作为我的根持久存储类型。它符合PersistedState
接口:
type RootState = {
name: string,
address: Address,
_persist?: PersistState
}
type Address = {
street: string
city: string
}
在未来的某个时候,我将我的模型更新为:
type RootState = {
name: string,
address: Address,
_persist?: PersistState
}
type Address = {
vacant: boolean
}
我需要提供一个看起来像这样的迁移:
const manifest: MigrationManifest = {
1: (state: PersistedState) => {
const persistedState = state as ???
const migratedState: RootState = migrateState(persistedState)
return migratedState
}
}
我正在苦苦挣扎的地方是获取传入状态的类型(我的演员所在的???
位置)。在像这样的简单示例中,很容易维护我的状态的每个版本的记录,并根据需要导入和使用它们:
import { RootState as RootState_v0 } from 'types_v0.ts'
const manifest: MigrationManifest = {
1: (state: PersistedState) => {
const persistedState = state as RootState_v0
const migratedState: RootState = migrateState(persistedState)
return migratedState
}
}
在实践中,并不是那么简单。我有一个复杂的状态树,并不是所有的状态树都定义在一个中央且易于版本化的位置。
我可以梦想的一种解决方案,但我不知道是否可行,将以某种方式创建我的RootState
类型的版本,其中所有中间类型别名和接口名称“已溶解”。就像是:
type RootState_v0 = {
name: string,
address: {
street: string
city: string
},
_persist?: {
version: number,
rehydrated: boolean
}
}
如果我能以某种自动方式创建它,那么在迁移中保存和使用将变得容易和方便。
是否有任何想法,或者关于如何在 react-redux 迁移中有效使用 Typescript 的任何其他建议?