gpt4 book ai didi

typescript - 如何从 Typescript 中包含多种类型的命名空间中获取联合类型?

转载 作者:行者123 更新时间:2023-12-04 16:55:25 26 4
gpt4 key购买 nike

我正在为我的 redux 定义类型状态和相应的 Action 。
这是我的组织方式:

declare namespace GLOBAL {

interface AUTH {
user: null | User
admin: boolean
}

interface APP_VERSION {
CURRENT: number
}

interface STATE {
AUTH: AUTH,
APP_VERSION: APP_VERSOPM
}

declare namespace ACTIONS { // THESE ARE THE ACTIONS THAT UPDATE THE "GLOBAL" PART OF THE "REDUX_STATE"

type UPDATE_AUTH = {
type: "UPDATE_AUTH",
payload: AUTH
}

type UPDATE_APP_VERSION = {
type: "UPDATE_APP_VERSION",
payload: APP_VERSION
}

// ETC

}

interface REDUX_STATE { // THIS IS THE SHAPE OF THE TOP LEVEL REDUX STATE
GLOBAL: GLOBAL.STATE, // "GLOBAL" USED WITHIN THE WHOLE APP
ADMIN: ADMIN.STATE // "ADMIN" IS ONLY USED IN ADMIN PAGES
}

}
我现在被困在这一点上:我需要 一种引用所有更新 GLOBAL 的操作的方法状态。 我会在我的 globalStateReducer 中使用的东西, 例如:
示例:
export const globalStateReducer(state: GLOBAL.STATE, actions: XXX) => {};

// NOTE: XXX should translate as the "UNION TYPE OF ALL ACTIONS LISTED IN GLOBAL.ACTIONS"
一种可能的解决方案:
每次给 GLOBAL.ACTIONS 添加一个 Action 我可以手动将它添加到一个联合类型,这将是这样的:
type ALL_GLOBAL_ACTIONS = UPDATE_AUTH | UPDATE_APP_VERSION | UPDATE_ANOTHER | UPDATE_SOMETHING | ETC...
然后我可以在我的 globalStateReducer() 中引用它(其他地方也会用到):
export const globalStateReducer(state: GLOBAL.STATE, actions: GLOBAL.ALL_GLOBAL_ACTIONS) => {};
但这是重复性工作,容易出错。
是否有一种自动方法来引用 GLOBAL.ACTIONS 中存在的所有类型和接口(interface)的联合类型?命名空间?或者我应该将我的类型的形状重新定义为其他东西?

最佳答案

也许您可以从一开始就将其定义为联合,而不是使用命名空间。

type ACTIONS =
| {
type: "UPDATE_AUTH",
payload: AUTH
}
| {
type: "UPDATE_APP_VERSION",
payload: APP_VERSION
}

// Now a helper to access an action type by string key
type ACTION<T, A = ACTIONS> = A extends { type: T } ? A : never

const updateAuth = (): ACTION<'UPDATE_AUTH'> => {
return ({ type: "UPDATE_AUTH", payload: ... })
}
所以不要使用 ACTIONS.UPDATE_AUTH你会用 ACTION<'UPDATE_AUTH'>

关于typescript - 如何从 Typescript 中包含多种类型的命名空间中获取联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63885579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com