【问题标题】:Is it possible to use custom type definitions in an ES6 project?是否可以在 ES6 项目中使用自定义类型定义?
【发布时间】:2017-05-31 13:57:03
【问题描述】:

我的团队从事一个相对较大的 NodeJS 项目,用 ES6 编写,通过 babel 进行转译,然后使用无服务器部署为 AWS lambdas。这个项目的重点是消费、映射/转换和输出我们定义的一种特定对象类型。

我们的问题是,ECMA/JavaScript 不是强类型的,所以如果我们犯了一个错误,比如在某处将字段视为数组而在其他地方视为字符串,则除了运行时错误外,没有什么可以捕捉到的。我们也没有很好地记录这个对象的结构,所以有时消费者会向我们发送对象的实例,其中包含我们说我们处理但实际上并没有使用的稍微命名错误的字段中的数据。

我正在寻找一种方法来为我们项目中的这个特定对象创建某种模式或类型定义,以便我们可以使用它来更正我们的代码,使我们的处理更加健壮,并为它创建更好的文档。现在,我知道 VSCode 在 JavaScript 中提供了一些 basic type checking,但我认为尝试 JSDoc 一个非常大的对象然后将该文档放入使用该对象的每个文件中是不可行的。我发现 VSCode 也可以以某种方式驱动检查with .d.ts files,但我不明白是否或如何将其用于我们设计的特定自定义对象。我发现的大部分内容似乎都与为外部库拉取 .d.ts 文件特别相关。

那么,TL:DR,在 NodeJS/ES6 项目中,是否有可能使一个在整个项目中广泛使用的对象成为强类型的? VSCode 中的错误检查是可以接受的,但是我们可以在转译之前触发的某种命令行 linting 也很棒。

【问题讨论】:

  • 在 JavaScript 中,没有。将所有内容都转换为 TypeScript,然后也许,尽管除了显式验证之外,您无法对将 munged 对象传递给 API 的外部代码做太多事情。
  • 您的问题正是打字稿存在的原因。您可以在打字稿中编写“一个对象”并在其他 javascript 文件中使用该对象。让打字稿发出带有compiler option --declaration 的声明文件,我认为当您require 编译的js 时,vscode 会检测到打字。 checkJS to emit type errors for javascript files 还有一个编译器选项。
  • 好吧,伙计们,想通了。 @rico-kahler 走在正确的轨道上,但大多数人只是拒绝接受。 stackoverflow.com/questions/44286781/…
  • @cgm123 嗯,是的,关于 ES6 的问题的严格答案是不。类型化的解决方案是不同的语言。

标签: javascript node.js ecmascript-6 visual-studio-code typechecking


【解决方案1】:

好吧,想通了。在我发布这个问题后,我一直在谷歌上搜索,大约一个小时后点击了 Sequoia McDowell 在 StrongLoop 上的这篇文章:https://strongloop.com/strongblog/type-hinting-in-javascript/

我非常密切地关注它,并且使用“typings”包,我能够在我的项目的根目录中初始化一个“typings”文件夹。该文件夹的内容现在如下所示:

typings/
├── models/
│   └── myObject.d.ts
└── index.d.ts

该 index.d.ts 文件的内容如下所示:

/// <reference path="models/myObject.d.ts" />

myObject.d.ts 文件的内容看起来有点像这样:

declare namespace MyProject {
  export interface MyObject {
    aString?: string;
    anotherString?: string;
    aComplexType?: ComplexType;
  }

  interface ComplexType {
    aString?: string;
    anotherComplexType: SecondComplexType;
  }

  interface SecondComplexType {
    aString?: string;
  }
}

完成后,我必须开始使用 JSDoc 标记该对象的实例。该文档主要有两种形式:

/**
 * Creates an instance of UtilityThing.
 * @param {MyProject.MyObject} myObject
 *
 * @memberof UtilityThing
 */
constructor(myObject) {
  this.myObject = myObject;
}

/**
 * @param {MyProject.MyObject} myObject
 * @returns {MyProject.MyObject}
 */
function noOp(myObject) {
  return myObject;
}

/** @type {MyProject.MyObject} */
const myObject = containerObject.myObject;

通过这个设置,以及最新的 VSCode 公开版本,我能够看到我当前正在编辑的 ES6 *.js 文件中的错误,告诉我哪些属性不存在,哪些属性被分配了错误的值类型,被认为是错误的类型,等等。

到了一半。

经过更多研究,我发现这并不是一个独特的 VSCode 功能。似乎他们正在使用“tslint”或它的一些定制版本。利用这些知识,我在项目中添加了“tslint”并制定了这个 npm 脚本:

"tslint": "tslint --type-check --project tsconfig.json"

这是我登陆的 tsconfig.json 的内容,尽管我不完全确定是否需要所有这些选项。

{
  "compilerOptions": {
    "target": "es6",
    "allowJs": true,
    "noResolve": true,
    "checkJs": true,
    "moduleResolution": "node",
    "types": [
      "node"
    ]
  },
  "exclude": [
    "node_modules",
    "coverage",
    "lib",
    "spec"
  ]
}

使用 tsconfig.json 和“typings”文件夹中的类型定义文件运行这个“tslint”脚本,让我可以使用正确的 JSDoc 对项目中所有文件中的一种特定对象类型进行类型检查。我确实遇到了small issue,但巧合的是,它似乎在一小时前已经修复并合并。除了类型检查对象的字段之外,这还揭示了几个地方,其中一个属性被过早地从其后代实际上具有该属性的对象中提取出来。很酷。

TL;DR:可以做到,非常感谢 Sequoia McDowell 的那篇文章,它最终让我走上了正轨。

【讨论】:

    【解决方案2】:

    我发现你可以在JS文件的开头设置// @ts-check*.d.ts文件将被识别(至少在项目的根目录)。

    VS 代码版本:1.22

    编辑:

    所以我用这个内容创建了jsconfig.json

    {
      "compilerOptions": {
        "jsx": "react",
        "checkJs": true,
        "noResolve": true, // because some imports didn't work
        "moduleResolution": "node" // because of npm i <git or local dependency>
      },
      "include": ["src/**/*", "types/**/*"],
      "exclude": ["node_modules"]
    }
    

    types 文件夹中,我有多个文件*.d.ts

    一切正常,您无需显式设置// @ts-check

    【讨论】:

      【解决方案3】:

      你不能在 Javascript 中强类型,即使你可以,你也不应该,javascript 被创建为一种动态语言,但在 typescript 中你可以

      查看此链接:https://basarat.gitbooks.io/typescript/docs/quick/nodejs.html

      【讨论】:

      • 你可以用 FlowType
      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多