You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript开发的NPM包中处理用户配置?

解决方案

针对你开发TypeScript NPM包的需求,这里提供几种无需在每个内部函数传递配置的实现方案:

方案1:闭包封装内部函数

把内部函数定义在公共API函数的作用域内,内部函数可以直接读取外层的配置参数,写法简洁直观:

export default function myPackage(number1: number, number2: number, acceptZero: boolean = true): number {
    function add(num1: number, num2: number): number {
        // 直接访问外层作用域的acceptZero配置
        if (!acceptZero && (num1 === 0 || num2 === 0)) {
            throw new Error('Cannot accept zero.')
        }
        return num1 + num2
    }

    return add(number1, number2)
}

方案2:配置对象注入(适合单元测试)

如果内部函数需要单独编写单元测试,可将配置封装成对象,在公共API中统一注入,既避免重复传参,又方便单独测试内部函数:

// 内部函数,接收配置参数(测试时可直接传入不同配置)
function add(num1: number, num2: number, config: { acceptZero: boolean }): number {
    if (!config.acceptZero && (num1 === 0 || num2 === 0)) {
        throw new Error('Cannot accept zero.')
    }
    return num1 + num2
}

// 公共API函数,封装配置并调用内部函数
export default function myPackage(number1: number, number2: number, acceptZero: boolean = true): number {
    const config = { acceptZero }
    return add(number1, number2, config)
}

方案3:绑定this上下文(面向对象风格)

如果偏好用this访问配置,可通过call/apply为内部函数绑定上下文,同时在TypeScript中指定this的类型:

// 定义this的类型,确保TypeScript类型校验
function add(this: { acceptZero: boolean }, num1: number, num2: number): number {
    if (!this.acceptZero && (num1 === 0 || num2 === 0)) {
        throw new Error('Cannot accept zero.')
    }
    return num1 + num2
}

export default function myPackage(number1: number, number2: number, acceptZero: boolean = true): number {
    // 绑定配置对象作为内部函数的this
    return add.call({ acceptZero }, number1, number2)
}

方案选择建议

  • 内部函数数量少、逻辑简单:优先方案1,代码最简洁。
  • 需要独立测试内部函数:选择方案2,测试时无需依赖公共API即可传入不同配置。
  • 习惯面向对象写法:方案3可以满足需求,但需要额外处理this的类型定义。

内容的提问来源于stack exchange,提问作者Jeroen van Rensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:19