¿Es posible usar definiciones de types personalizados en un proyecto ES6?

Mi equipo trabaja en un proyecto NodeJS relativamente grande, escrito en ES6, transstackdo por babel y luego implementado como AWS lambdas con Serverless. Este proyecto se centra en consumir, mapear / transformar y generar un tipo de object específico, que hemos definido.

Nuestro problema es que ECMA / JavaScript no está fuertemente tipado, por lo que si cometemos un error como tratar un campo como una matriz en alguna parte y una cadena en otro lugar, no hay nada que capte, excepto los errores en time de ejecución. También hemos documentado mal la estructura de este object, por lo que a veces los consumidores nos envían instancias del object con datos en campos ligeramente mal nombrados que decimos que procesamos, pero que en realidad no utilizamos.

Estoy buscando una forma de crear algún tipo de esquema o definición de tipo para este object específico en nuestro proyecto, para que podamos usar eso para corregir nuestro código, hacer que nuestro procesamiento sea más robusto y crear una documentation mucho mejor para él. Ahora, sé que VSCode ofrece algunas comprobaciones básicas de types en JavaScript, pero no creo que sea factible intentar con JSDoc un object realmente grande y luego colocar ese documento en cada file que use el object. He descubierto que VSCode también puede, de alguna manera, controlar esa verificación con files .d.ts, pero no entiendo si puedo aprovechar eso para un object personalizado específico que hemos diseñado. La mayoría de lo que he encontrado parece estar específicamente relacionado con la extracción de files .d.ts para bibliotecas externas.

Entonces, TL: DR, ¿es posible, en un proyecto NodeJS / ES6, hacer que un object, ampliamente utilizado en todo el proyecto, se escriba fuertemente? La comprobación de errores en VSCode sería aceptable, pero también sería genial algún tipo de borrado de la command-line que pudiéramos disparar antes de transstackr.

2 Solutions collect form web for “¿Es posible usar definiciones de types personalizados en un proyecto ES6?”

Bien, lo descubrí. Después de publicar esta pregunta, seguí buscando en Google y después de una hora más o less llegué a este artículo en StrongLoop de Sequoia McDowell: https://strongloop.com/strongblog/type-hinting-in-javascript/

Lo seguí muy de cerca y, usando el package "typings", pude inicializar una carpeta "typings" en la raíz de mi proyecto. El contenido de esa carpeta ahora se ve así:

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

El contenido de ese file index.d.ts se ve así:

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

Y el contenido de ese file myObject.d.ts tiene un aspecto vagamente parecido a este:

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

Una vez hecho esto, tuve que empezar a marcar instancias de este object con JSDoc. Ese documento principalmente toma dos 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; } 

y

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

Con esta configuration y la última versión pública de VSCode, pude ver errores en los files ES6 * .js que estaba editando actualmente y que me indicaban qué attributes no existían, a qué valores de tipo incorrecto se asignaban, se asumió que era del tipo incorrecto, etc.

A mitad de path.

Después de investigar un poco más, descubrí que esta no es exactamente una característica exclusiva de VSCode. Parece que están usando "tslint" o alguna versión personalizada de él. Trabajando con ese conocimiento, agregué "tslint" al proyecto y resolví este script npm:

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

Aquí están los contenidos del tsconfig.json en el que llegué, aunque no estoy del todo seguro de que se necesiten todas estas opciones.

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

Ejecutar este script "tslint" con ese tsconfig.json y los files de definición de tipo en la carpeta "typings" me permite escribir un tipo de object específico en todos los files del proyecto con el JSDoc adecuado. Me encontré con un pequeño problema, pero parece que lo arreglaron y fusionaron hace una hora, casualmente. Además de escribir en los campos del object, esto también reveló un par de lugares donde un atributo fue extraído prematuramente de un object cuyo descendiente realmente tenía ese atributo. Muy genial.

TL; DR: Se puede hacer, enorme gracias a Sequoia McDowell por ese artículo que finalmente me puso en el path correcto.

No se puede escribir con fuerza en Javascript, e incluso si se puede, no se debe, javascript se creó para ser un lenguaje dynamic, pero en typescript se puede

Consulte este enlace: https://basarat.gitbooks.io/typescript/docs/quick/nodejs.html

  • VSCode intelliSense autocompletar para javascript
  • ¿Cómo depurar async / await en el código visual studio?
  • Cómo comstackr un file TypeScript desde el nuevo código de Visual Studio en Mac OS X
  • Los 'tipos' de js solo se pueden usar en un archivo .ts - Visual Studio Code usando @ ts-check
  • VSCode Linter ES6 ES7 Babel linter
  • Captura de evento emergente del browser
  • ¿JSHint es compatible con el nodo 7 (async / await)?
  • Documentar el código de Javascript en VSCode para Intellisense
  • ¿Cómo configuro VSCode para poner llaves en una nueva línea?
  • Depurar tanto javascript como c # en ASP.NET Core MVC usando código VS
  • comstackr typescript con una tarea de código de estudio visual, especificando el directory de salida
  • Use el object window en angular2 pero vscode "No se puede encontrar el nombre 'window'"
  • Mapeo inverso para enum de cadenas
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.