【问题标题】:How can we make an argument of an inner function optional depending on an argument of the outer function?我们如何根据外部函数的参数使内部函数的参数成为可选的?
【发布时间】: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
  }
}

这里好像不行: Screenshot from the code editor with the error

【问题讨论】:

    标签: typescript react-redux redux-toolkit


    【解决方案1】:

    您可以使用 TypeScript 方法重载来做到这一点。只需声明参数的所有可能性并返回值,如下所示:

    function outer(a: number): (b: number) => any;
    function outer(): (b?: number) => any;
    function outer(a?: number) {
      return function inner(b?: number) {
        // some stuff
      };
    }
    

    您可以将any 更改为闭包实际返回的任何值

    VSCode 在第二行正确出错,因为它需要一个参数

    【讨论】:

    • Op 要求 function outer(a: number): (b?: number) =&gt; any;function outer(): (b: number) =&gt; any;,与您所拥有的相反。它应该在第一个错误,而不是第二个错误。
    • 函数重载适用于这个简单的例子。但是当我试图将这种方法应用于更复杂的情况时,我遇到了一个错误。我已经更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2018-04-12
    • 2016-01-13
    • 2021-09-21
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多