是否可以在ES6项目中使用自定义类型定义?

cgm123

我的团队致力于一个相对较大的NodeJS项目,该项目由ES6编写,由babel进行编译,然后与Serverless一起部署为AWS lambda。这个项目的重点是消费,映射/转换和输出我们定义的一种特定对象类型。

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

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

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

cgm123

好吧,想通了。发布此问题后,我一直进行谷歌搜索,大约一个小时后,由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的“ tslint”脚本以及“ typings”文件夹中的类型定义文件,使我可以使用适当的JSDoc对整个项目中的所有文件进行类型检查。我确实遇到了一个小问题,但巧合的是,大约一个小时前,该问题已解决并合并。除了对对象的字段进行类型检查之外,这还揭示了几个地方,该属性是从对象的后代实际上具有该属性的对象中过早地拉出属性的。很酷。

TL; DR:这是可以完成的,这要感谢红杉McDowell的那篇文章,它使我最终走上了正确的道路。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试在项目中使用自定义ES6 Phaser.Plugin时找不到模块

如何在angular 6项目中使用自定义jquery代码?

在angular 6项目中添加具有自定义属性的自定义脚本

在Vue CLI 3项目中使用自定义Bootstrap SASS的步骤是什么?

在Spring MVC项目中使用自定义jar

是否可以在gitlab 8中使用自定义钩子进行项目提交?

TRESTRequest:是否可以在POST请求中使用自定义媒体类型?

在TypeScript中,导出自定义ES6模块并导入到另一个本地项目中始终是未定义或{}

是否可以在报告中使用自定义字段

是否可以在Android自定义样式中使用AppThemeBinding?

是否可以在自定义组件中使用骆驼组件?

是否可以在 SQLAlchemy 中使用嵌套的自定义函数?

如何在 Visual Studio 安装项目中使用自定义表单自定义安装向导

在JavaScript VSCode项目中添加自定义类型文件

是否可以在 Sass 变量的定义中使用 CSS 自定义属性,如果可以,如何使用?

在多模块项目中使用自定义React Hook进行Jest测试时出错

无法在 Spring Boot 项目中使用自定义 jar

如何在以Android Studio编写的项目中使用自定义字体

在自己的项目中使用自定义聚合物元素-如何正确执行?

如何在recyclerview项目中使用自定义视图?

无法在Cocos2d-x项目中使用自定义字体

在Spring MVC项目中使用带有自定义消息转换器的springdoc

如何在GWT项目中使用自定义包结构?

如何在Xamarin共享项目中使用自定义渲染器

不能在其他项目中使用自定义视图(aar lib)

由于在 maven 项目中使用自定义 jars,Jenkins 构建失败

是否可以从包含自定义类型元素的列表中删除重复项?

是否可以在自定义ADT(排序链接列表)中使用2种数据类型?

如何将 es6 箭头函数参数替换为自定义类型(接口)?