【问题标题】:Overloading a react callback重载反应回调
【发布时间】:2021-10-30 12:46:11
【问题描述】:

我正在尝试严格键入钩子的返回回调。

  • 如果未指定 InputType,则在调用函数时不需要输入,如果提供了任何输入,则应报错。
  • 如果指定了InputType,它应该期望输入类型,如果不是指定的类型,则会报错。

例子

 // overload attempts
 async function someFnAsyncCB(): void;
 async function someFnAsyncCB<InputType>(input: InputType): void;

function useSomeFnHook<InputType = undefined>() {
 const [reactiveVar, setReactiveVar] = useState("");
 // ...
 const someFnAsync = useCallback(
  async function someFnAsyncCB<InputType>(input?: InputType): void {
   // ...
  },
  [reactiveVar, etc],
 );
 return someFnAsync;
}

我的实现工作除了当 someFnAsync 没有使用输入调用但 InputType 被指定为未定义以外的其他类型时。 Typescript 应该抱怨我没有提供输入值。

我尝试重载函数,但 Typescript 没有将新的重载函数与原始函数关联。

我将如何实现我的初始目标?

【问题讨论】:

  • 也许使用typeinterface 输入函数会起作用-stackoverflow.com/a/53143568/11145447
  • @programmerRaj 我应该如何改变它来实现我的目标?
  • 为什么函数someFnAsyncCB是通用的?为什么需要someFnAsyncCB&lt;InputType&gt;(input: InputType): void 而不仅仅是someFnAsyncCB(input: any): void
  • @programmerRaj 严格类型检查。我不希望接受无效的输入。
  • InputType 是一种类型吗?

标签: javascript reactjs typescript overloading


【解决方案1】:

当您不需要泛型类型时,您正在使用泛型类型。

替换

async function someFnAsyncCB<InputType>(input: InputType): void;

async function someFnAsyncCB(input: InputType): void;

修改后的钩子将如下所示:

function useSomeFnHook<InputType = undefined>() {
 const [reactiveVar, setReactiveVar] = useState("");
 // ...
 const someFnAsync = useCallback(
                              // No <Generic>
  async function someFnAsyncCB(input?: InputType): void {
   // ...
  },
  [reactiveVar, etc],
 );
 return someFnAsync;
}

关于泛型的文档:https://www.typescriptlang.org/docs/handbook/2/generics.html

【讨论】:

  • 当我试图重载函数时,我正在为someFnAsyncCB 使用泛型。此解决方案无法解决我的问题。
  • @SILENT 为什么需要重载函数?
  • 因为“我的实现工作,除了没有使用输入调用 someFnAsync 但 InputType 指定为未定义以外的其他类型。Typescript 应该抱怨我没有为它提供输入值。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2016-09-09
  • 2021-06-03
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多