【发布时间】:2021-11-23 05:51:22
【问题描述】:
有一个函数返回另一个函数。如果存在外部函数的参数,我想将内部函数的参数设为可选参数,否则为强制参数。
function outer(a?: number) {
// How can we make b here optional if a is present and mandatory otherwise?
return function inner(b: number) {
// some stuff
};
}
当然,我们可以在外层函数内部只返回两个签名不同的函数,但不知道有没有更好的解决方案。
更新
函数重载的解决方案适用于这个简单的例子。
function outer(a: number): (b?: number) => any;
function outer(a?: number): (b: number) => any;
function outer(a?: number) {
return function inner(b?: number) {
// some stuff
};
}
outer(1)(2);
outer(1)();
outer()(1);
关于 Redux 的真实示例:
import { AsyncThunk, createAsyncThunk } from "@reduxjs/toolkit";
type RecipeGetter = () => string[];
type ThunkWithOptionalRecipeIds = AsyncThunk<
Record<string, string>,
string[] | undefined,
Record<string, never>
>;
type ThunkWithRequiredRecipeIds = AsyncThunk<
Record<string, string>,
string[],
Record<string, never>
>;
function getFetchRecipesByIdThunk(
typePrefix: string,
recipeIdGetter: RecipeGetter,
): ThunkWithOptionalRecipeIds;
function getFetchRecipesByIdThunk(
typePrefix: string,
recipeIdGetter?: RecipeGetter,
): ThunkWithRequiredRecipeIds;
function getFetchRecipesByIdThunk(
typePrefix: string,
recipeIdGetter?: RecipeGetter,
) {
return createAsyncThunk(typePrefix, async (recipeId?: string[]) => {
// some stuff
}
}
【问题讨论】:
标签: typescript react-redux redux-toolkit