Cách ghi lại kiểu chuỗi trong jsdoc với các giá trị giới hạn có thể có


96

Tôi đang có một hàm chấp nhận một tham số chuỗi. Tham số này chỉ có thể có một trong một vài giá trị có thể được xác định. Cách tốt nhất để ghi lại tài liệu giống nhau là gì? ShapeType có nên được định nghĩa là enum hoặc TypeDef hay thứ gì khác không?

Shape.prototype.create = function (shapeType) {
    // shapeType can be "rect", "circle" or "ellipse"...
    this.type = shapeType;
};

Shape.prototype.getType = function (shapeType) {
    // shapeType can be "rect", "circle" or "ellipse"...
    return this.type;
};

Phần thứ hai của vấn đề là các giá trị có thể shapeTypekhông được biết đến trong tệp xác định shapeTypelà bất kỳ giá trị nào bạn đề xuất. Có nhiều tệp được đóng góp bởi một số nhà phát triển, những người có thể thêm vào các giá trị có thể có của shapeType.

PS: Đang sử dụng jsdoc3


Vấn đề nhiều tệp làm cho việc này trở nên khó khăn. Tôi thường thấy enumđối với các định nghĩa và một liên minh cho tham số chức năng: ShapeType|string. Tuy nhiên, enums không hỗ trợ thêm các kiểu con sau khi khai báo trong Closure-compiler.
Chad Killingsworth 30/09/13

@ChadKillingsworth Tôi hiểu ý bạn. Tôi bị mắc kẹt tại một điểm mà tôi muốn xác định một tập hợp các thuộc tính (giả sử một đối tượng đi dưới dạng tham số xây dựng của một lớp). Tốt và tốt là tất cả các tài sản của công trình được xác định tại một địa điểm. Thật không may, mã của tôi có một số mô-đun đóng góp vào thuộc tính xây dựng đó. Làm một cái gì đó giống như một mixin hoặc phân lớp thích hợp sẽ đi quá đà! Như vậy, nếu tôi có thể chỉ cần đưa vào định nghĩa danh sách thuộc tính thì sẽ rất tuyệt.
Shamasis Bhattacharya

Một vấn đề tương tự mà tôi đang phải đối mặt, nhưng với việc niêm yết bất động sản phân phối là stackoverflow.com/questions/19113571/...
Shamasis Bhattacharya

Tất cả các giải pháp dưới đây buộc chúng ta phải tạo một Enum. Có một yêu cầu tính năng đang hoạt động trên GitHub để giúp quá trình này dễ dàng hơn nhiều: github.com/jsdoc3/jsdoc/issues/629 . Vì vậy, bất kỳ ai thích nó có lẽ nên chạm vào nó.
B12Toaster

Câu trả lời:


26

Làm thế nào về việc khai báo một enum giả:

/**
 * Enum string values.
 * @enum {string}
 */
Enumeration = {
    ONE: "The number one",
    TWO: "A second number"
};

/**
 * Sample.
 * @param {Enumeration} a one of the enumeration values.
 */
Bar.prototype.sample = function(a) {};


b = new Bar();

bar.sample(Enumeration.ONE)

Tuy nhiên, ít nhất bạn cần khai báo enum cho JSDOC. Nhưng mã sạch và bạn nhận được tự động hoàn thành trong WebStorm.

Tuy nhiên, vấn đề nhiều tệp không thể được giải quyết theo cách này.


Đúng. Phương pháp liệt kê là cách hữu dụng duy nhất mà tôi thấy. Dù sao, tôi chấp nhận đây là câu trả lời có thể sử dụng duy nhất - vì vấn đề nhiều tệp hoàn toàn là một câu chuyện khác!
Shamasis Bhattacharya

Vấn đề với cách tiếp cận này là nó không cho phép ghi lại các giá trị riêng lẻ. Tôi gặp sự cố với JSDoc. github.com/jsdoc3/jsdoc/issues/1065
Gajus

112

Tính đến cuối năm 2014 trong jsdoc3, bạn có thể viết:

/**
 * @param {('rect'|'circle'|'ellipse')} shapeType - The allowed type of the shape
 */
Shape.prototype.getType = function (shapeType) {
  return this.type;
};

Tất nhiên điều này sẽ không thể tái sử dụng như enum chuyên dụng nhưng trong nhiều trường hợp, enum giả là quá mức cần thiết nếu nó chỉ được sử dụng bởi một chức năng.

Xem thêm: https://github.com/jsdoc3/jsdoc/issues/629#issue-31314808


4
Đây là một giải pháp tốt hơn nếu bạn biết rằng kiểu tham số sẽ không bao giờ thay đổi.
Lucatylesb

1
Giải pháp tốt nhất cho điều này theo quan điểm của tôi! Cảm ơn bạn.
AJC24

26

Thế còn:

/**
 * @typedef {"keyvalue" | "bar" | "timeseries" | "pie" | "table"} MetricFormat
 */

/**
 * @param format {MetricFormat}
 */
export function fetchMetric(format) {
    return fetch(`/matric}`, format);
}

nhập mô tả hình ảnh ở đây


9

Tôi không nghĩ rằng có một cách chính thức để viết các giá trị được phép trong JSDoc .

Bạn chắc chắn có thể viết một cái gì đó giống @param {String('up'|'down'|'left'|'right')}như người dùng b12toaster đã đề cập.

nhập mô tả hình ảnh ở đây

Nhưng, bằng cách lấy tham chiếu từ APIDocjs , đây là những gì tôi sử dụng để viết các giá trị bị ràng buộc, hay còn gọi là Giá trị được phép .

/**
 * Set the arrow position of the tooltip
 * @param {String='up','down','left','right'} position pointer position
 */
setPosition(position='left'){
  // YOUR OWN CODE
}

Ồ đúng rồi, tôi đang sử dụng ES6.


0

Đây là cách mà Trình biên dịch đóng cửa hỗ trợ nó: bạn có thể sử dụng "@enum" để xác định một kiểu hạn chế. Bạn không thực sự phải xác định các giá trị trong định nghĩa enum. Ví dụ: tôi có thể xác định kiểu "số nguyên" như:

/** @enum {number} */
var Int = {};

/** @return {Int} */
function toInt(val) {
  return /** @type {Int} */ (val|0);
}

Int thường có thể gán cho "number" (nó là một số) nhưng "number" không thể gán cho "Int" nếu không có sự ép buộc nào đó (cast).


Nhưng điều đó không hạn chế các giá trị có thể có của Int. Đó là phần tôi không chắc là có thể.
Chad Killingsworth

Nó hoạt động nhiều như bất kỳ loại chú thích hoặc enum nào khác trong JS. Hạn chế đến từ cách bạn viết mã: mỗi "cast" là một lá cờ đỏ. Nếu bạn giới hạn phôi ở các nhà máy có giá trị thì bạn sẽ có được thứ mình muốn: bạn không thể gán 'số' cho 'Int' mà không có cảnh báo.
John

Nó vẫn không hạn chế các giá trị của {Int}. :-(
Shamasis Bhattacharya

Chắc chắn rồi, bạn hạn chế giá trị của Int bằng cách giới hạn cách nó được tạo và việc hạn chế được thực hiện khi giá trị được tạo. Không thể chỉ định một số thô, đó là tất cả những gì bạn cần.
John
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.