Javascript 是否可以创建一个;“出口疲软”;打字

Javascript 是否可以创建一个;“出口疲软”;打字,javascript,typescript,types,dead-code,tree-shaking,Javascript,Typescript,Types,Dead Code,Tree Shaking,测试模块化代码的一个不幸之处是,有时您不得不导出一些东西来测试它们。这会污染您的代码,并且还会降低编译器上的“unused variable”标志或linter等功能的价值-如果您删除了应用程序中的某个用法,那么您的测试中可能仍有该用法 一种可能的解决方案是类似“弱引用”的东西,其中测试代码将引用它正在测试的东西,但带有一个明确的“linter,compiler:请不要将此引用作为用法”标志 我检查了tsc标志和tslintconfig文档,但没有看到任何内容。A) 我错过什么了吗?B) 这是个

测试模块化代码的一个不幸之处是,有时您不得不导出一些东西来测试它们。这会污染您的代码,并且还会降低编译器上的“unused variable”标志或linter等功能的价值-如果您删除了应用程序中的某个用法,那么您的测试中可能仍有该用法

一种可能的解决方案是类似“弱引用”的东西,其中测试代码将引用它正在测试的东西,但带有一个明确的“linter,compiler:请不要将此引用作为用法”标志

我检查了
tsc
标志和
tslint
config文档,但没有看到任何内容。A) 我错过什么了吗?B) 这是个好主意吗?实施起来有多困难

(其他解决方案就没那么好了。例如,你不能导出东西,然后使用
重新布线
对模块进行内省,以获取私人物品。我的理解是,tsc将无法遵循这样的参考。)


感谢您的帮助。

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

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
  }
}

如果你能提供一个更具体的例子,我也许能提供更多的帮助

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