【问题标题】:Typescript nested functions with default function具有默认功能的打字稿嵌套函数
【发布时间】:2023-01-09 22:08:14
【问题描述】:

我搜索了很多但没有找到适合我的东西。 我想为我的应用程序创建一个自定义控制台记录器。

它只会记录是否处于开发模式,我想这样称呼它:

// isDev === true
logger('log') //prints 'log'
logger.error('error') // prints 'error'
// isDev === false
logger('log') // prints nothing
logger.error('error') // prints nothing

我试过创建这个方法,但我得到的最接近的是:

function logger(...data: any[]) {

    if(!isDev) return
    console.log(...data)

    return {
        error: console.error(...data)
    }
}

当我调用它时,会发生这种情况:

// isDev === true
logger('log') // This is ok, prints 'log'
logger('error').error // This is wrong
// prints 'error' twice: One is a normal log and other is the error log
// I want only print the error log

和 ...

// isDev === false
logger('test').error // throws error "Cannot read properties of 'undefined'

这个方法应该怎么写? 谢谢您的帮助

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    我不确定这是否是一个好主意TM值首先,由于构建过程中出现混乱,这清楚地表明在使用过程中会出现混乱。混乱导致错误。简单的可能偶尔看看太简单凭直觉,我们想要一些东西聪明的,但简单易懂和支持。

    话说回来...

    也许是这样的?:

    function logger(message) {
      if (message) {
        console.log(message);
      }
      return {
        message: msg => console.log(msg),
        error: err => console.error(err)
      }
    }
    
    logger('log test 1');
    logger().error('error test 1');
    logger().message('log test 2');

    基本上它是一个函数,如果提供了参数,它有条件地执行默认操作,但如果需要,它也会返回一个具有执行更具体操作的函数的对象。在默认用法中,可以忽略返回的对象。

    作为变体,您也可能只有条件地返回,例如:

    function logger(message) {
      if (message) {
        console.log(message);
      } else {
        return {
          message: msg => console.log(msg),
          error: err => console.error(err)
        }
      }
    }
    
    logger('log test 1');
    logger().error('error test 1');
    logger().message('log test 2');

    同样的,它只是防止意外的双重使用,例如:

    logger('message test').error('error test');
    

    【讨论】:

    • 感谢您的帮助,但我最终使用了 Object.assign。查看答案以获取更多详细信息
    【解决方案2】:

    我最终使用了 Object.assign

    export const logger = Object.assign(
        // here we assign the default call
        // so we call -> logger('log')
        ( ...data: any[] ) => {
            if ( !isDev() ) return
            console.log( ...data )
        }, {
            // here we assing all subfunctions
            // so we can call -> logger.error('error')
            error: ( ...data: any[] ) => {
                if ( !isDev() ) return
                console.error( ...data )
            },
            // or call -> logger.trace('trace')
            trace: ( ...data: any[] ) => {
                if ( !isDev() ) return
                console.trace( ...data )
            },
            // or call -> logger.warn('warn')
            warn: ( ...data: any[] ) => {
                if ( !isDev() ) return
                console.warn( ...data )
            }            
        }
    )
    

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 2021-11-10
      • 2019-08-03
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多