typescript - 打字稿在两个函数中重载了可选参数
问题描述
我有一个解析器函数,它可能有一个可选的第二个参数,称为 otherParams。我希望 Typescript 检查从 createResourceThunk 返回的函数是否也使用参数 otherParams 调用,如果它是在解析器函数中定义的。我怎样才能做到这一点?这里的最小可重现示例
export function createResourceThunk<T, Params, A, OtherParams extends A | never>(
actions: ResourceActions<T>,
resolver: (params: Params, otherParams: OtherParams) => Promise<T>
) {
return function(params: Params, callbacks: Callbacks<T>, otherParams: OtherParams) {
return async (dispatch: Dispatch) => {
dispatch(actions.startAction());
try {
const data = await (otherParams ? resolver(params, otherParams) : resolver(params));
...
} catch (error) {
...
}
};
};
}
目前,在返回函数的调用中总是期望第三个参数
解决方案
鉴于链接示例中的代码,我倾向于使用以下类型:
export function createResourceThunk<T, P, O extends [] | [otherParams: any]>(
actions: ResourceActions<T>,
resolver: (params: P, ...args: O) => Promise<T>
) {
return function (params: P, callbacks: Callbacks<T>, ...otherParamsArr: O) {
const [otherParams] = otherParamsArr; // if you care
return async (dispatch: Dispatch) => {
dispatch(actions.startAction());
try {
const data = await resolver(params, ...otherParamsArr);
dispatch(actions.successAction({ data }));
callbacks && callbacks.onSuccess && callbacks.onSuccess({ data });
} catch (error) {
dispatch(actions.errorAction({ error }));
callbacks && callbacks.onError && callbacks.onError({ error });
}
};
}
}
这里重要的部分是“可选”第二个参数表示为一个休息参数,其类型是休息元组类型的联合。类型参数是参数之后的参数列表。它被限制为具有零个元素 ( ) 或一个元素 ( )。因此,在您想说您将使用休息参数之前的任何地方,例如.O
params
[]
[otherParams: any]
otherParams
...otherParamsArr
这在实现内部工作,没有错误或类型断言是必要的。您可以验证这也适用于调用方:
// with OptionalParam
const func1 = createResourceThunk('any', (a: { a: number }, b: string) => Promise.resolve('any'))
func1({ a: 1 }, { successAction: () => { } }, 'somestring') // okay
func1({ a: 1 }, { successAction: () => { } }); // error
// without OptionalParam
const func2 = createResourceThunk('any', (a: { a: number }) => Promise.resolve('any'))
func2({ a: 1 }, { successAction: () => { } }) // okay
func2({ a: 1 }, { successAction: () => { } }, 'somestring') // error
推荐阅读
- reactjs - 等待 setState 完成,然后返回数据
- installation - 如何使用 Portacle IDE 在 Common Lisp 中实现 Common Music?
- node.js - 为什么我的服务器会从两个不同的页面向同一个 put 函数发出代理请求,并且只在一个页面上工作?
- flutter - 在物理设备上运行颤振应用程序时出现错误
- angular - 条件使用 isDevMode 不会被摇树
- python - DFGUI (Kivy) 没有属性“显示”
- c# - TestWebACL 错误原因:您的语句为一个字段设置了多个值,而该字段只需要一个值
- java - Maven 项目中的 ClassNotFoundException 问题
- python - 我希望在 tkinter 中显示图像
- c# - 我的班级似乎有 2 个同名的不同变量