【问题标题】:Change interface to an object type将接口更改为对象类型
【发布时间】:2020-06-17 06:13:52
【问题描述】:

如果我只是一个接一个地传递道具,下面的效果很好

Example: const [] = useHook(3, 500, ref);

但是我想把它改成一个对象:

Example: const [] = useHook({spike: 0, timeout: 500});

如何在我的界面中编写它并仍然保留我的函数返回类型。

   interface IProps {
      (spike?: number, timeout?: number, ref?: any): [
        string,
        number,
        string| null,
      ];
    }

    const useHook: IProps = (
      spike= 10,
      timeout= 500,
      ref = null,
    ) => {

【问题讨论】:

    标签: javascript typescript interface


    【解决方案1】:
    interface IHookArgs {
      spike?: number; 
      timeout?: number; 
      ref?: any
    }
    
    interface IProps {
          (args: IHookArgs): [
            string,
            number,
            string| null,
          ];
        }
    
    const useHook: IProps = ({ spike = 5, timeout = 6, ref = undefined}) => {
     return ['', spike, '']
    }
    
    const [] = useHook({spike: 0, timeout: 500});
    

    但我更喜欢用 type 而不是 interface 来描述函数:

    interface IHookArgs {
      spike?: number; 
      timeout?: number; 
      ref?: any
    }
    
    type HookType = (args: IHookArgs) => [string, number, string| null];
    
    const useHook: HookType = ({ spike = 5, timeout = 6, ref = undefined}) => {
     return ['', spike, '']
    }
    
    const [] = useHook({spike: 0, timeout: 500});
    

    【讨论】:

    • 谢谢。我注意到的一件事是,当我在没有任何参数的情况下调用钩子时,会收到以下警告: Expected 1 arguments, but got 0.ts useHook.tsx(27, 18): An argument for 'args' is not provided。如果没有任何参数,我希望它不会发出警告,因为它们是可选的并且默认设置。
    • 我已经尝试过使用 ?运算符,但随后函数中的 args 错误输出。类型 'IHookArgs | 上不存在属性 'spike'未定义'。
    • 这里除了 args 还有什么其他想法吗?:IHookArgs
    • 只需添加默认值。更新了答案。看看这样行不行。
    • 不幸的是默认或没有默认数字它仍然不起作用。那么上面的代码对你有用吗?除非我在 const [] = useHook({}) 中添加一个空对象,否则我仍然会遇到同样的错误,这是我想要消除的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2013-01-08
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多