【问题标题】:Importing functions using Typescript使用 Typescript 导入函数
【发布时间】:2021-06-10 10:51:16
【问题描述】:

TLDR - 在 ReactJs 中使用 Typescript 的这些导入有什么区别:

setState1: (numbers: number[]) => void,
setState2: Function

大家好,我最近遇到了(对我而言)在 React 上使用 Typescript 导入函数的奇怪行为。为了更好地解释它,我将放示例代码:

const FuncComp: React.FC = () => {
   const [state1, setState1] = useState<number[]>([]);
   const [state2, setState2] = useState<number[]>([]);

   const handleSettingState1 = () => {
       console.log("state1-",state1);
       setState1([...state1, 1]);
   }
   console.log("state1-",state1);

   const handleSettingState2 = () => {
       console.log("state2-",state2);
       setState1([...state2, 2]);
   }
   console.log("state2-",state2);

   const saveChanges = () => {
       saveHandler(
          saveFunc,
          setState1,
          setState2
       )
   }
....
}

handleSettingState1handleSettingState2 都是传递给子组件和从子组件设置的函数,saveChangesFuncComp 内按钮的 onClick 函数,saveHandler 是从帮助文件导入的,它看起来像这样:

export const saveHandler = (
    saveFunc: GqlMutationType,
    setState1: (numbers: number[]) => void,
    setState2: Function
) => {
    saveFunc()
        .then(() => {
            setState1([]);
            setState2([]);
        })
        .catch((err: AxiosError) => {
            console.log(err);
        });
};

如您所见,setState1setState2 的导入方式不同。 现在的问题是,当我通过处理程序设置两个状态时 -> 执行保存(它应该在 then 回调中清除两个数组) -> 设置另一个值,state1 内部和外部都将为空 @ 987654332@ 作用域,而state2handleSettingState2 内将具有旧值,但在类作用域内为空。

我在子组件中跳过了handleSettingState2handleSettingState2 的实现,因为我认为这无关紧要,但如果它影响到我也可以提供。

【问题讨论】:

  • 这里没有导入,这些只是类型定义。此外,类型定义和整个类型系统不会改变任何运行时行为。这两个函数是相同的,如果你得到不同的结果,那不是因为类型定义。

标签: javascript reactjs typescript methods react-functional-component


【解决方案1】:

您可以像这样更新保存处理程序。

export const saveHandler = (
    saveFunc: GqlMutationType,
    cb: (data: any) => void
) => {
    saveFunc()
        .then(data => cb(data))
        .catch((err: AxiosError) => {
            console.log(err);
        });
};

导入和调用函数

import { saveHandler } from './filename';
...
...
function saveFn() {}

saveHandler(saveFn, (data) => {
   setState([...data]);
})

【讨论】:

  • 你的语法无效
  • 嗨,请告诉我错误在哪里。我只是放了一个 sn-p 来展示一种回调方法。提前致谢。
  • cb(data: any): void 是无效的参数声明。它必须是cb: (data: any) =&gt; void
  • 更新了代码@AluanHaddad 请检查。
猜你喜欢
  • 2021-12-07
  • 2021-10-10
  • 2020-11-27
  • 2019-10-31
  • 2018-07-18
  • 2020-02-26
  • 2017-08-13
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多