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

我的团队工作在一个相对较大的NodeJS项目上,由ES6编写,由babel转发,然后部署为带有Serverless的AWS lambda。 这个项目主要围绕消费,映射/转换和输出一个我们已经定义的特定对象types。

我们的问题是,ECMA / JavaScript不是强types的,所以如果我们犯了一个错误,就像将某个字段视为一个数组的某个地方,而另一个string在其他地方,除了运行时错误,没有什么可以捕获的。 我们也没有很好的logging这个对象的结构,所以有时候消费者会把我们说我们处理的,但是实际上并没有使用的稍微错误的字段中的数据发给我们实例。

我正在寻找一种方法来为我们的项目中的这个特定对象创build一些模式或types定义,所以我们可以使用它来纠正我们的代码,使我们的处理更健壮,并为它创build更好的文档。 现在,我知道VSCode在JavaScript中提供了一些基本的types检查 ,但我认为尝试JSDoc一个非常大的对象,然后将该文档放在每个使用该对象的文件中是不可行的。 我发现VSCode也可以用.d.ts文件驱动检查,但是我不明白是否可以利用这个特性来devise我们devise的自定义对象。 我发现的大部分内容似乎与拉动外部库的.d.ts文件有关。

那么,TL:DR,在一个NodeJS / ES6项目中,是否有可能使得在整个项目中广泛使用的一个对象成为强types? 在VSCode中检查错误是可以接受的,但是在传输之前我们可以触发的某种命令行定义也会很好。

你不能强的types,即使你可以,你不应该,JavaScript被创build为一个dynamic的语言,但在打字稿,你可以

检出这个链接: https : //basarat.gitbooks.io/typescript/docs/quick/nodejs.html

好吧,算出来。 在我发布这个问题后,我一直用googlesearch,经过一个小时左右,在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标记这个对象的实例。 该文件主要有两种forms:

 /** * 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文件中的错误,告诉我哪些属性不存在,哪些属性被指定了错误types的值,被认为是错误的types等

一半在那里。

经过一些更多的研究,我发现这不完全是一个独特的VSCodefunction。 看来他们正在使用“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”文件夹中的types定义文件运行这个“tslint”脚本允许我使用适当的JSDoc在项目中的所有文件中键入一个特定的对象types。 我遇到了一个小问题,但似乎在一个小时前已经被修复和合并,巧合的是。 除了types检查对象的字段之外,这也显示了一些地方,其中一个属性过早地从其后裔实际上具有该属性的对象中拉出。 很酷。

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