【问题标题】:Is it possible to create a "weak export" in TypeScript是否可以在 TypeScript 中创建“弱导出”
【发布时间】:2019-01-27 11:15:48
【问题描述】:

关于测试模块化代码的一个不幸的事情是,有时您必须导出一些东西来测试它们。这会污染您的代码,并且还会降低编译器或 linter 上的“未使用变量”标志等不错的功能 - 如果您在应用程序中删除了一个用法,您的测试中可能仍然有一个用法。

一种可能的解决方案是类似于“弱引用”,其中测试代码将引用它正在测试的东西,但使用明确的“linter,编译器:请不要将此引用视为使用”标志。

我检查了tsc 标志和tslint 配置文件,但什么也没看到。 A)我错过了什么吗? B) 这是个好主意吗?实施起来有多难?

(其他解决方案就没有那么好。例如,您不能导出内容然后使用rewire 对模块进行自省以获取私有内容。我的理解是 tsc 将无法遵循这样的参考。)

感谢您的帮助。

【问题讨论】:

  • unused * 无论如何都不适用于任何导出的内容,我不会导出任何不属于模块公共 API 的内容,我只会测试模块的公共 API,我不会关注私有实现细节。但是为了解决您的问题,我认为没有办法做到这一点,有一个未记录的编译器标志告诉编译器是否在 d.ts 中包含导出,但我不确定在这种情况下是否会有所帮助.
  • 如果你在没有测试的情况下编译你的应用程序,tree-shaker 应该能够删除所有未使用的函数

标签: javascript typescript types dead-code tree-shaking


【解决方案1】:

将它们分离到不同的模块中,这样您就可以更轻松地对其进行测试。假设您有以下用例。

function a () {/* implementation */}
export function b () {
   //... code
   a()
  //..code
}

如果“a”在不同的模块上并且被“b”要求,那么您的测试可以直接要求该模块。对模块('b')依赖项使用控制反转也可能很有用。这将允许您注入模拟/间谍并更好地测试它。在我们的 a/b 示例中,它应该看起来像这样。

import {a} from './a'
export function CreateB(aFunc:a = a){
  return function b(){
    //..code
    aFunc()
    //..code
  }
}

如果你能提供一个更具体的例子,我可能会提供更多帮助。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 2021-08-03
    • 2012-01-16
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多