Typescript:几个特定类型值组合的联合



我不知道如何总结这个问题。以下是我想要实现的:

我有一些api处理程序,createA, updateA, deleteA, createB, updateB,…,并且我想导出一个包含所有处理程序的对象,例如:

const API = {
A: {
CREATE: createA,
UPDATE: updateA,
...
},
B: {
CREATE: createB,
...
},
...
}

然后用一个函数获取处理程序:

type KeyAction = {
key: "A" | "B" | "C";
action: "CREATE" | "UPDATE" | "DELETE"
}
const getHandler = ({key, handler}: KeyAction) => {
return API[key][action];
}

然而,假设B没有删除处理程序,我如何正确地定义类型,使这个return API[key][action]没有ts错误?

我试过了

type KeyAction = {
key: "A" | "C";
action: "CREATE" | "UPDATE" | "DELETE"
} | {
key: "B";
action: "CREATE" | "UPDATE"
}

可惜运气不好。

如何使函数泛型?

const getHandler = <
K extends keyof typeof API, 
A extends keyof typeof API[K]
>({ key, action }: { key: K, action: A }) => {
return API[key][action];
}
getHandler({ key: "A", action: "UPDATE" })
getHandler({ key: "B", action: "UPDATE" }) // Error

通过定义泛型K(代表API的一个有效键)和A(代表API[K]的一个键),可以使函数中的错误沉默,也可以在调用带有无效参数的函数时得到错误。

游乐场

最新更新