如何为Typescript编译问题进行lint?

如何为Typescript编译问题进行lint?,typescript,tslint,pre-commit-hook,husky,lint-staged,Typescript,Tslint,Pre Commit Hook,Husky,Lint Staged,采用以下类型脚本箭头函数: /** * Returns a probably unique component name. * * @param baseName a suggested name to make unique. * @returns a probably unique name. */ export const getUniqueComponentName = ( baseName ): string => { return baseName + Ma

采用以下类型脚本箭头函数:

/**
 * Returns a probably unique component name.
 * 
 * @param baseName a suggested name to make unique.
 * @returns a probably unique name.
 */
export const getUniqueComponentName = (
  baseName
): string => {
  return baseName + Math.round(Math.random() * 10000000)
}
tsconfig.json
中配置Typescript时:

"noImplicitAny": true,
这将正确地导致编译错误:

[ts]参数'baseName'隐式具有'any'类型

VisualStudio代码也足够聪明,可以在开发过程中通知您这个问题

我的目标是创建一个预提交git钩子,以防止此类错误最终出现在版本控制中。我试着用
tslint
husky
lint staged
使用这个
npm脚本来实现这一点:

"lint": "tslint --project tsconfig.json --config tslint.json"
但是,这不会导致tslint显示编译错误。它被默默地忽略了

然后我尝试在tslint.json中添加一条规则:

"typedef": [
      true,
      "arrow-parameter"
    ]
虽然这确实使tslint抱怨,但它也开始在
tsc
编译器不抱怨的匿名箭头函数中抱怨。在这些箭头函数中,不必添加类型,因为这些类型以前已在父范围中设置(它们是推断的)


因此,基本上,我希望tslint在本例中的行为与tsc相同。任何时候出现可能导致编译失败的错误(如上面的箭头函数),我都希望阻止提交,但不实际编译为Javascript。这可能吗?

我认为最好的办法是运行
tsc--noEmit-p.
并过滤修改文件中的错误输出。例如,我将以下脚本保存到
tsc一些文件中:

#!/bin/bash
declare -A include_files
for f in "$@"; do
  include_files["${f#$PWD/}"]=1
done
node_modules/.bin/tsc --noEmit -p . | (
  status=0
  show_continuation=false
  while IFS='' read -r line; do
    case "$line" in
    (' '*)
      if $show_continuation; then
        echo "$line" >&2
      fi
      ;;
    (*)
      file="${line%%(*}"
      if [ -n "${include_files["$file"]}" ]; then
        show_continuation=true
        echo "$line" >&2
        status=1
      else
        show_continuation=false
      fi
      ;;
    esac
  done
  exit $status
)
并将
/tsc一些文件
设置为我的
lint staged
命令,它似乎可以工作。(如果需要,用bash以外的编程语言编写这篇文章将留给读者作为练习。)


请记住,编辑一个文件可能会在另一个文件中引入错误(例如,如果您更改了另一个文件正在使用的内容的类型),因此我建议您尽快通过任何必要的黑客手段清除项目中的TypeScript错误(只要您标记它们,以便以后可以搜索它们)然后将钩子设置为在整个项目中不需要任何错误。事实上,特别是关于
noImplicitAny
,几年前我将一个JavaScript项目迁移到TypeScript时,我编写了一个脚本,在出现隐式
any
错误的地方插入显式
any
,然后我在空闲时修复了显式
any
s。如果您感兴趣,我可以与您分享该脚本。

我没有足够的声誉将此添加为评论,但是任何人如果遇到类似的错误

./scripts/ts-staged-files.sh: line 4: 
   src/ui/Components/Select/Select.tsx: division by 0 
  (error token is "/Components/Select/Select.tsx")
我对Matt McCutchen的答案做了一个小小的修改来修复它

#!/bin/bash

include_files=()

for f in "$@"; do
  include_files+=("${f#$PWD/}")
done

运行
tsc--noEmit
会起作用吗?这实际上是在不生成JS的情况下运行静态分析器。@y2bd是的,我确认它可以工作;这是推荐的方法吗?除了在我的工作流程中运行tslint?之外,我通常会执行一个正常的构建,并丢弃工件(以及一个单独的lint阶段)。如果您处于这样一种情况,那么这似乎是完全正确的。@y2bd根据它不可能让
lint staged
仅对提交的文件运行
tsc
。只有在不传入
p
标志,但忽略所有配置选项的情况下,才可能执行此操作。另外,您不能将
路径
配置作为命令行参数传递,因此不使用
p
似乎不是一个选项?@y2bd如果您能详细说明我之前的问题,我将提供150个代表的奖金。这将在整个项目上运行tsc,而不仅仅是在提交的文件上。您关心什么?性能,或者在下次修改这些文件之前要忽略的其他文件中存在的错误?第二种情况主要是。第一个稍微:)更新了答案。
-A
在Mac上对我不起作用,所以我改为
-A
,假设它是一样的。