我不知道如何总结这个问题。以下是我想要实现的:
我有一些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]
的一个键),可以使函数中的错误沉默,也可以在调用带有无效参数的函数时得到错误。
游乐场