代码之家  ›  专栏  ›  技术社区  ›  Tom

如何处理类型脚本编译问题?

  •  10
  • Tom  · 技术社区  · 8 年前

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

    /**
     * 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)
    }
    

    在中配置typescript时 tsconfig.json 像这样的:

    "noImplicitAny": true,
    

    这将正确导致编译错误:

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

    Visual Studio代码也足够智能,可以在开发期间通知您有关此问题的信息。

    我的目标是创建一个预调试Git挂钩,以防止此类错误最终出现在版本控制中。我试着这么做 tslint , husky 和 lint-staged 使用这个 npm script :

    "lint": "tslint --project tsconfig.json --config tslint.json"
    

    但是,这不会导致tslint显示编译错误。它被悄悄地忽略了。

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

    "typedef": [
          true,
          "arrow-parameter"
        ]
    

    虽然这确实让tslint抱怨,但它也开始在匿名arrow函数中抱怨, tsc 编译器没有抱怨。在这些箭头函数中,不需要添加类型,因为这些类型以前已在父作用域中设置过(它们是推断的)。

    所以基本上,我希望tslint在本例中的行为与tsc相同。任何时候如果有错误会导致编译失败(如上面的箭头函数),我都希望防止提交,但实际上没有编译到JavaScript。这有可能吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Matt McCutchen    8 年前

    我想你最好的选择是跑步 tsc --noEmit -p . 并过滤修改文件中的错误输出。例如,我将以下脚本保存到 tsc-some-files :

    #!/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-some-files 作为我的 lint-staged 命令,而且似乎有效。(如果需要,可以用bash以外的编程语言编写,这将留给读者作为练习。)

    请记住,编辑一个文件可能会在另一个文件中引入错误(例如,如果您更改了另一个文件正在使用的某个文件的类型),因此我建议您尽快通过任何必要的黑客程序清除您的项目中的打字脚本错误(只要您标记了它们,这样您就可以搜索到然后设置钩子,使整个项目不需要任何错误。事实上,关于 noImplicitAny 特别是几年前,当我将一个javascript项目迁移到typescript时,我编写了一个脚本,它插入了一个显式的 any 到处都有暗含的 任何 错误,然后我修复了显式 任何 我有空。如果你感兴趣的话,我可以分享剧本。

        2
  •  0
  •   jmmendez    7 年前

    我没有足够的声誉将此添加为评论,但任何出现类似错误的人

    ./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
    
    推荐文章