6

Nhóm của tôi làm việc trên một dự án NodeJS tương đối lớn, được viết bằng ES6, được chồng chéo bởi babel, và sau đó được triển khai dưới dạng AWS lambdas với Serverless. Dự án này tập trung vào việc tiêu thụ, ánh xạ/chuyển đổi và xuất ra một loại đối tượng cụ thể mà chúng tôi đã xác định.Có thể sử dụng các định nghĩa kiểu tùy chỉnh trong dự án ES6 không?

Vấn đề của chúng tôi là, ECMA/JavaScript không được gõ mạnh, vì vậy nếu chúng ta mắc lỗi như xử lý trường dưới dạng mảng ở đâu đó và chuỗi ở nơi khác, không có gì để bắt ngoại trừ lỗi thời gian chạy. Chúng tôi cũng đã ghi lại cấu trúc của đối tượng này, vì vậy đôi khi người tiêu dùng gửi cho chúng tôi các cá thể của đối tượng có dữ liệu trong các trường có tên sai mà chúng tôi nói rằng chúng tôi xử lý nhưng không thực sự sử dụng.

Tôi đang tìm cách tạo một số loại định nghĩa lược đồ hoặc loại cho đối tượng cụ thể này trong dự án của chúng tôi, để chúng tôi có thể sử dụng điều đó để sửa mã của chúng tôi, giúp quá trình xử lý của chúng tôi trở nên mạnh mẽ hơn và tạo tài liệu tốt hơn cho nó . Bây giờ, tôi biết VSCode cung cấp một số basic type checking trong JavaScript, nhưng tôi không nghĩ rằng nó khả thi để thử JSDoc một đối tượng thực sự lớn và sau đó đặt tài liệu đó trong mọi tệp sử dụng đối tượng. Tôi đã tìm thấy rằng VSCode cũng có thể, bằng cách nào đó, lái xe mà kiểm tra with .d.ts files nhưng tôi không hiểu nếu hoặc làm thế nào tôi có thể tận dụng cho một đối tượng cụ thể, tùy chỉnh mà chúng tôi đã thiết kế. Hầu hết những gì tôi đã tìm thấy có vẻ liên quan đặc biệt đến việc kéo các tệp .d.ts cho các thư viện bên ngoài.

Vì vậy, TL: DR, Có thể, trong một dự án NodeJS/ES6, để tạo một đối tượng, được sử dụng rộng rãi trong suốt dự án đó, được đánh máy mạnh mẽ? Lỗi kiểm tra trong VSCode sẽ được chấp nhận, nhưng một số loại dòng lệnh linting mà chúng ta có thể kích hoạt trước khi transpiling cũng sẽ rất tuyệt.

+2

Trong JavaScript, không. Chuyển đổi mọi thứ thành TypeScript, sau đó * có thể *, mặc dù bạn không thể làm được nhiều về mã bên ngoài truyền một đối tượng bị cắt vào API của bạn ngoài việc xác thực nó một cách rõ ràng. – Pointy

+3

Vấn đề của bạn chính xác là lý do tại sao các bản ghi tồn tại. Bạn có thể viết "một đối tượng" của bạn trong bản ghi và sử dụng đối tượng đó trong các tệp javascript khác. Có kiểu chữ phát ra một tệp khai báo với tùy chọn [trình biên dịch '--declaration'] (https://www.typescriptlang.org/docs/handbook/compiler-options.html) và tôi nghĩ khi bạn' yêu cầu 'các js đã biên dịch, vscode sẽ phát hiện các kiểu gõ. Ngoài ra còn có một tùy chọn trình biên dịch để ['checkJS' phát ra các lỗi loại cho các tệp javascript] (https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html#errors-in- js-files-với --- checkjs). –

+0

[Điều này cũng giúp ích một chút.] (Https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files) –

Trả lời

3

Được rồi, đã tìm ra. Sau khi tôi đăng câu hỏi này, tôi tiếp tục googling và sau một giờ hoặc lâu hơn, nhấn vào bài viết này trên StrongLoop bởi Sequoia McDowell: https://strongloop.com/strongblog/type-hinting-in-javascript/

Tôi theo dõi nó khá chặt chẽ và sử dụng gói "đánh máy", tôi có thể khởi tạo " typings "thư mục gốc của dự án của tôi. Nội dung của thư mục mà bây giờ trông như thế này:

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

Nội dung của tập tin mà nhìn index.d.ts như thế này:

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

Và nội dung của tập tin đó myObject.d.ts nhìn một cái gì đó mơ hồ như thế này:

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

    interface ComplexType { 
    aString?: string; 
    anotherComplexType: SecondComplexType; 
    } 

    interface SecondComplexType { 
    aString?: string; 
    } 
} 

Khi đã xong, tôi phải bắt đầu đánh dấu các trường hợp của đối tượng này bằng JSDoc. doc mà chủ yếu mất hai hình thức:

/** 
* 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; 

Với thiết lập này, và việc phát hành công cộng mới nhất của VSCode, tôi đã có thể nhìn thấy lỗi trong các tập tin ES6 * .js mà tôi hiện đang là chỉnh sửa cho tôi biết thuộc tính nào không tồn tại, được gán giá trị sai loại, được cho là loại sai, v.v.

Nửa chừng ở đó.

Sau một số nghiên cứu khác, tôi đã tìm ra rằng đây không phải là tính năng VSCode duy nhất. Có vẻ như họ đang sử dụng "tslint" hoặc một số phiên bản tùy chỉnh của nó. Làm việc với các kiến ​​thức đó, tôi thêm vào "tslint" cho dự án và làm việc ra kịch bản NPM này:

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

Dưới đây là nội dung của tsconfig.json mà tôi đã đổ bộ lên, mặc dù tôi không hoàn toàn chắc chắn tất cả các tùy chọn này là cần thiết.

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

Chạy này "tslint" kịch bản, với tsconfig.json đó, và các tập tin định nghĩa kiểu trong "typings" thư mục cho phép tôi để gõ dấu vào một loại đối tượng cụ thể trong suốt tất cả các file trong dự án với JSDoc thích hợp. Tôi đã chạy vào một small issue nhưng điều đó dường như đã được cố định và sáp nhập khoảng một giờ trước đây, tình cờ. Ngoài loại kiểm tra các trường của đối tượng, điều này cũng tiết lộ một vài nơi mà một thuộc tính đã sớm được kéo từ một đối tượng mà con cháu thực sự có thuộc tính đó. Rất tuyệt.

TL; DR: Nó có thể được thực hiện, rất lớn nhờ Sequoia McDowell cho bài viết đó cuối cùng đã đặt tôi đi đúng hướng.

1

Bạn có thể không mạnh gõ Javascript, và thậm chí nếu bạn có thể, bạn không nên, javascript được tạo ra để trở thành một ngôn ngữ năng động, nhưng trong nguyên cảo bạn có thể

Thanh toán liên kết này: https://basarat.gitbooks.io/typescript/docs/quick/nodejs.html

+0

Bạn có thể với FlowType –

Các vấn đề liên quan