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

2023-12-22

我的团队正在开发一个相对较大的 NodeJS 项目,该项目用 ES6 编写,由 babel 转译,然后使用 Serverless 部署为 AWS lambda。该项目的重点是使用、映射/转换和输出我们定义的一种特定对象类型。

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

我正在寻找一种方法来为项目中的这个特定对象创建某种模式或类型定义,因此我们可以使用它来纠正我们的代码,使我们的处理更加健壮,并为其创建更好的文档。现在,我知道 VSCode 提供了一些基本类型检查 https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files在 JavaScript 中,但我认为尝试 JSDoc 一个非常大的对象,然后将该文档放入使用该对象的每个文件中是不可行的。我发现 VSCode 也可以以某种方式驱动该检查与 .d.ts 文件 https://code.visualstudio.com/docs/languages/javascript#_type-checking-and-quick-fixes-for-javascript-files但我不明白是否或如何将其用于我们设计的特定自定义对象。我发现的大部分内容似乎与为外部库提取 .d.ts 文件特别相关。

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


好吧,想通了。在我发布这个问题后,我继续谷歌搜索,大约一个小时后,我在 StrongLoop 上看到了 Sequoia McDowell 写的这篇文章:https://strongloop.com/strongblog/type-hinting-in-javascript/ 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;
}

and

/** @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 对项目中的所有文件中的一种特定对象类型进行类型检查。我确实遇到了小问题 https://github.com/palantir/tslint/issues/2568但这似乎是大约一个小时前修复并合并的,巧合的是。除了对对象字段进行类型检查之外,这还揭示了几个位置,其中属性被过早地从其后代实际上具有该属性的对象中提取。很酷。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 ES6 项目中使用自定义类型定义? 的相关文章

  • 如何使用nodeJS SFTP客户端列出所有子目录?

    有趣的节点 JS ssh2 sftp client 我想列出给定路径中的所有目录及其子目录 let sftp new ssh2SftpClient console log sftp sftp connect host xx xxx xxx
  • angularjs 自定义过滤器检查数据数组内的值

    我有两个过滤器 它们根据数据中的队列键过滤数据 这是我的代码 var app angular module app app controller mainController function scope Data object scope
  • 如何监控浏览器中发出的所有自定义事件?

    我想监视网络浏览器中触发的所有自定义事件 任何标准浏览器都可以 需要明确的是 我知道您可以附加事件处理程序来查看何时触发 通常 事件 但如何可靠地检测嵌入对象或 jQuery 脚本是否触发自定义事件 我可以重构浏览器源代码来挂钩事件循环 但
  • 从 Angular 6 服务中绑定图像

    我有一个端点 它根据某些参数为我提供图像 这不是一个图像网址 而是一个普通图像 因此 当我到达邮递员中的端点时 作为响应 我收到一张图像 JPG 我是否可以在变量中接收该图像并将其绑定到 HTML 标签中 所有问题都有将图像 url 映射到
  • 画布图像遮罩/重叠

    在我的项目中 我必须使用画布在另一个相同尺寸和图案图像上实现一个不同的颜色图像 并且图像不是圆形或矩形形状 所有这些都是波浪形状的 它将应用于单个主背景图像 以便在每个主背景图像上显示多个图形onclick功能 重叠的图像应更改为另一种选定
  • 使用 JavaScript 填写 PDF 表单

    这就是我所拥有的 用户填写很长的 html 表单 用户获取下载不同 pdf 的链接 这是可填写的表格 链接是使用 javascript 生成的 用户单击链接 生成 url 使用用户之前提交的数据 在表单中处理数据并完成字段 这是在表单内使用
  • nodejs gmail api不支持承诺

    Google 推荐使用承诺 https developers google com api client library javascript features promises 但它的代码示例没有 当我修改代码时 我正在努力使 gmail
  • Ember.js 数组作为模型的属性

    干杯 我有一些模型 它的一个属性是一个数组 但由于某些原因 我在服务器上使用 mongoDB 并且它是嵌入式模型和 ember data 的问题 我不能做这样的事情 App Foo DS Model extend numbers DS ha
  • 赋予 d3 序数轴标签与尺度名称不同

    我有一个序数scale具有不同值的某些标签 我想显示该比例的轴 其中轴标签与比例标签不同 我有这个代码 var width 1000 var height 600 var margins left 100 40 right 25 botto
  • jQuery UI 对话框使用 setTimeout 自动关闭

    我试图让对话框在打开后三秒自动关闭 我尝试过以下方法 setTimeout mydialog dialog close 3000 这是在上下文中 acknowledged dialog dialog height 140 modal tru
  • 如何正确关闭 Node.js Express 服务器?

    我需要在收到回调后关闭服务器 auth github callback网址 与平常一样HTTP API http nodejs org docs latest api http html关闭 服务器目前支持server close call
  • Angular UI.Bootstrap 单选按钮在 ng-repeat 中表现得很奇怪[重复]

    这个问题在这里已经有答案了 我在 Angular 的 ui bootstrap 中动态生成无线电模型的选项时遇到问题 我想我可以简单地对数组进行 ng repeat 使用 btn radio 属性的内容 如下所示 in the contro
  • 如何防止在达到一定字符数后向文本区域输入内容?

    使用下面的代码 任何超过指定最大值的输入都将被删除 但这会产生一种效果 即键入字符后立即将其删除 我宁愿简单地阻止输入字符
  • Google Maps JS Api - b.get 不是函数错误(isLocationOnEdge)

    我想检查我的路线上是否有标记 所以我尝试使用 isLocationOnEdge 但收到 TypeError b get 不是函数 错误 这是我的代码 我尝试了几次更改但无法解决问题 var directionsDisplay new goo
  • Django 模板变量从 {% for %} 循环到 Javascript

    这是一个迭代记录的 Django 模板 每条记录都包含一个由 JS 函数填充的 div 为了让 JS 知道要做什么 它需要从每次 for 循环迭代中获取一个变量并使用它 我不知道具体如何实现这一目标或是否可能 我不知道 也许记录在单独的 J
  • 无法在 postgres insert 中插入问号

    我正在尝试运行一个简单的 Postgres SQL 插入 insert into Resources values 1 How are you 但插入后的结果是 ID Data 1 How are you 1 我知道 要插入单引号等字符 我
  • 如何混淆或使 JavaScript 文件不可读?

    我的应用程序中有 JavaScript 脚本 其中包含 JavaScript 和 jQuery 函数 所有用户与我的应用程序的交互都是动态的 并且通过 jQuery 传递到应用程序 我意识到 当我在客户端运行我的应用程序时 客户端可以通过查
  • router.navigate 使用查询参数 Angular 5

    我在使用查询参数路由到路由时遇到问题我有一个像这样的函数 goToLink link this router navigate link split 0 queryParams this sortParams link 和这个功能 sort
  • 网页执行回发时如何停止在注册表单上?

    我正在做我的最后一年的项目 其中 我在一页上有登录和注册表单 WebForm 当用户点击锚点时Sign Up下拉菜单ddlType 隐藏 和文本框 txtCustName txtEmail and txtConfirmPassword 显示
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐

  • iOS 自定义键盘 - 相机不工作

    我想创建一个自定义键盘 充当条形码扫描仪 我已经完成了整个编码 但输出并不符合预期 我被要求提供相机权限 第一次 但相机没有向视图发送视频 我认为 出于安全原因 使用键盘可能会受到一些限制 1 打开手电筒 void turnFlashOn
  • 将 csv 文件合并到一个文件中

    我有一组 csv 文件 我想将它们合并到一个 csv 文件中 需要一些时间 但我在目标路径中找不到该文件 hdfs dfs getmerge DATA data1 result csv 任何帮助 谢谢 getmerge Usage hado
  • Unix:调用 select() 时读取文件描述符关闭时会发生什么

    假设我在包含一堆读取文件描述符的 FD SET 上调用 select 如果在 select 调用期间 文件描述符之一关闭 会发生什么情况 假设发生某种错误 那么我有责任从集合中查找并删除已关闭的文件描述符吗 我不相信这是在任何地方指定的 某
  • 为什么 Rails 4scaffold 创建 json.jbuilder 文件?

    我使用以下命令生成了一个新的 Rails 4 rc1 项目rails new并使用生成了一个脚手架rails g scaffold 正如预期的那样 它已经创建了迁移 控制器和所有必需的视图文件 它还创建了 show json jbuilde
  • 使用 VBA 选择单个节点 XML 对象

    您好 我正在尝试访问下面的 XML 响应对象
  • 权限拒绝:启动 Intent 未从 uid 导出

    当我从我自己的应用程序打开手机中已安装的应用程序时 我遇到了这个问题 权限拒绝 启动 Intent act android intent action MAIN 猫 android intent category LAUNCHER cmp
  • HTML5画布点击事件

    我做了一个正方形数组 ctx fillStyle rgb 0 0 0 for x 0 x lt 25 x for y 0 y lt 25 y ctx fillRect x y 20 20 我想要一个正方形在点击时改变它的颜色 我怎样才能做到
  • UITableViewCell 设置最初选择的

    您好 我遇到了这样的情况 在 iPad 应用程序中 我的master controller有清单和细节控制器有它的细节 一个典型的UISplitViewController图案 我想要实现的是 我的第一行应该最初被选择 然后我想给用户选择
  • Blackberry - 如何渲染 PDF 文档?

    如何通过您自己的应用程序阅读 BlackBerry 中的 pdf 文件 在黑莓中没有 API 或库可以做这样的事情 不过你可以尝试集成谷歌文档 http docs google com or www docspal com http www
  • CALayerInvalidGeometry 在 iOS9 上崩溃“具有非有限位置的子层 [inf inf]”

    iOS 9 Swift 2 我有一个带有自定义视图的视图控制器 每当我从导航控制器堆栈中弹出它时 它就会崩溃 引用以下崩溃 Terminating app due to uncaught exception CALayerInvalidGe
  • 适用于 LG G4 的带数字和小数点的 Android 键盘

    我在 Android 中使用以下元素EditText 有一个带有数字和小数点的键盘 用于显示键盘布局输入金额 例如 22 12 android inputType numberDecimal 它适用于所有设备 如三星 Nexus 索尼等 T
  • 无法加载模板:uib/template/modal/window.html

    我觉得我已经尝试了一切 但仍然收到错误 无法加载模板 uib template modal window html 在我的索引文件中我添加了以下内容 在我的应用程序文件中我添加了 ui bootstrap 在我的控制器文件中我添加了以下内容
  • 如何使容器中的行垂直居中? [复制]

    这个问题在这里已经有答案了 默认情况下 该行与顶部对齐 我尝试将 margin top auto 和边距底部 自动 但不起作用 也垂直对齐 居中 也不起作用 有一个简单的解决办法吗 Thanks container background c
  • 安全存储密码的最佳方法

    在计算机上保存密码以使其无法被访问的最佳方法是什么 我想将它们加密存储在注册表中 我希望您能够重置密码 但这不适用于服务器 这是为了将它们存储在计算机上以记住它们并自动登录 重要编辑 我需要能够从程序内检索纯文本密码 而不是其他任何地方 加
  • Carthage:iOS平台没有共享框架方案(对于我自己的框架)

    我创建一个框架 称为 ProjectOne 构建并测试了它 我想让这个框架用于Carthage 我编辑了我的方案并设为默认值 ProjectOne 方案共享于XCODE 我做了一个迦太基建造并验证该框架是内置的迦太基 构建 iOS I th
  • 使用 Twitter Bootstrap,如何“记住”用户操作?

    我正在使用引导警报框 并且希望这些框 记住 它们是否已关闭 这样当用户登录会员区域并关闭警报时 当他们下次访问该网站时 警报仍然消失 有什么办法可以做到这一点吗 div class alert message success a class
  • 作为 SQL 作业代理执行 SSIS 包失败 - 返回 DTSER_FAILURE (1)

    在此作业中 SSIS 用于将表数据转换为 Excel 文件 它已成功将表数据转换为 Excel 文件 但仍然显示 作业失败 以下是作业历史记录中显示的消息 适用于 32 位的 Microsoft R SQL Server 执行包实用程序版本
  • Jade - 控制 HTML 输出中的换行符

    我有一个简单的搜索表单 我希望使用 Jade 来实现 form input type text size 16 placeholder Enter your keywords input type button value Search 输
  • Winforms ComboBox SelectedItem 更改不会影响 BindingSource

    我正在制作 C WinForms 应用程序 我 还 无法解决的问题是 当我以编程方式更改 ComboBox 的 SelectedItem 时 它会发生更改 直到 ComboBox 失去焦点 之后它会在分配 SelectedItem 之前 提
  • 是否可以在 ES6 项目中使用自定义类型定义?

    我的团队正在开发一个相对较大的 NodeJS 项目 该项目用 ES6 编写 由 babel 转译 然后使用 Serverless 部署为 AWS lambda 该项目的重点是使用 映射 转换和输出我们定义的一种特定对象类型 我们的问题是 E