我的团队致力于一个相对较大的NodeJS项目,该项目由ES6编写,由babel进行编译,然后与Serverless一起部署为AWS lambda。这个项目的重点是消费,映射/转换和输出我们定义的一种特定对象类型。
我们的问题是,ECMA / JavaScript的类型不是很强,所以如果我们犯了一个错误,例如将字段视为数组,将字段视为字符串,而将字符串视为其他地方,则除了运行时错误之外,没有其他东西可以捕捉到。我们也没有很好地记录该对象的结构,因此有时消费者会向我们发送该对象的实例,并在我们说我们处理但未实际使用的名称稍有错误的字段中添加数据。
我正在寻找一种为项目中的特定对象创建某种模式或类型定义的方法,因此我们可以使用它来更正我们的代码,使我们的处理更健壮并为其创建更好的文档。现在,我知道VSCode在JavaScript中提供了一些基本的类型检查,但是我认为尝试JSDoc一个非常大的对象然后将该文档放入使用该对象的每个文件中是不可行的。我发现VSCode也可以通过某种方式来驱动.d.ts文件的检查,但是我不知道我是否或如何可以将其用于我们设计的特定自定义对象。我发现的大多数内容似乎都与为外部库提取.d.ts文件有关。
因此,TL:DR,在NodeJS / ES6项目中是否可以使在整个项目中广泛使用的一个对象成为强类型?在VSCode中进行错误检查是可以接受的,但是我们可以在转译之前触发的某种命令行检测方法也很棒。
好吧,想通了。发布此问题后,我一直进行谷歌搜索,大约一个小时后,由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] 删除。
我来说两句