【问题标题】:Typescript optional object argument craziness打字稿可选对象参数疯狂
【发布时间】:2022-11-16 06:02:40
【问题描述】:

所以我试图让一个对象参数成为可选的,带有可选的道具,同时有一个默认值:

const myfunc = ({ stop = false }: { stop?: boolean } = { stop: false }) => {
    // do stuff with "stop"
}

这工作正常,但请注意疯狂的函数定义!

有什么办法不重复这么多代码?

【问题讨论】:

  • 如果你有一个默认选项,那么它就不是可选的.. IOW:只是摆脱?
  • 嗯,实际上你在这里处理两件事。 (1) 允许没有条目的参数对象,即 myfunc({}) 和 (2) 不允许参数对象,即 myfunc()。这导致冗长。

标签: javascript typescript function


【解决方案1】:

我可能会这样写:

interface MyFuncOptions {
  stop: boolean;
}
const myFunc = (options: Partial<MyFuncOptions> = {}) => {
  const defaultOptions: MyFuncOptions = {
    stop: false,
  };
  const finalOptions = {
    ...defaultOptions,
    ...options
  }
  const { stop } = finalOptions;
  // ...
}

【讨论】:

    【解决方案2】:

    虽然这个问题确实是自以为是,但我在这里看到了一个小的逻辑改进,您可以将默认值设置为一个空对象:

    const myfunc = ({ stop = false }: { stop?: boolean } = {}) => {
        // do stuff with "stop"
    }
    

    无论如何,我同意这不是真正可读的,而且我曾经这样编写代码很长一段时间。在某些时候我意识到,如果你拆分这条语句,它会更具可读性:

    interface MyFunctionArgs {
      stop?: boolean
    }
    
    const myfunc = (myArgs: MyFunctionArgs = {}) => {
        const { stop = false } = myArgs;
        // do stuff with "stop"
    }
    

    总而言之,我会说 TypeScript 为您提供了很多方法来实现同样的事情,这有其优点和缺点。

    【讨论】:

      【解决方案3】:

      据我所知,如果您不提供任何参数,那么 stop = false 是默认设置,如果您确实选择了一些参数但省略了 stop,stop 也是 false。

      这就是我会做的->

      const myfunc = (p: {stop?: boolean} = { stop: false }) => {
          // do stuff with "stop"
          const {stop = false} = p;
          console.log(stop);
      }
      
      
      myfunc({stop: false});   //stop = false
      myfunc({stop: true});    //stop = true
      myfunc({});              //stop = false
      myfunc();                //stop = false
      

      添加额外的参数也不会变得更复杂。

      const myfunc = (p: {stop?: boolean, start?: boolean} = 
        { stop: false, start: false }) => {
          // do stuff with "stop"
          const {stop = false, start = false} = p;
          console.log(stop, start);
      }
      
      
      myfunc({stop: false});              //false false
      myfunc({stop: true, start: true});  //true  true
      myfunc({});                         //false false
      myfunc();                           //false false 
      myfunc({start: true});              //false true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 2018-05-26
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        相关资源
        最近更新 更多