Làm thế nào để chống lại hàng tấn cảnh báo về các biến chưa được giải quyết trong Webstorm?


110

Tôi có một hàm lấy dữ liệu từ máy chủ:

function getData(data){
    console.log(data.someVar);
}

Webstorm nói rằng someVar- là một biến chưa được giải quyết. Tôi có thể làm gì để thoát khỏi những cảnh báo như vậy?

Tôi thấy một số tùy chọn:

  • Loại bỏ cảnh báo trong cài đặt Ide;
  • Thêm tệp nguồn json với các trường ( chi tiết );
  • Sử dụng mảng giống như cú pháp: data['some_unres_var'];

Ngoài ra, Webstorm đề nghị tôi tạo không gian tên cho "dữ liệu" (thêm chú thích như /** @namespace data.some_unres_var*/), tạo trường như vậy hoặc đổi tên nó.


2
@hellboy Câu trả lời nhanh: nhấp chuột phải -> Sử dụng Thư viện Javascript -> đảm bảo HTML được chọn. Theo dõi điều này bằng cách xem các thư viện javascript có sẵn trong cài đặt dự án để hiểu rõ hơn về những gì đang xảy ra.
owensmartin

Câu trả lời:


102

Sử dụng JSDoc:

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}

8
Đối với các biến sử dụng cú pháp này/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs

3
Bạn sẽ làm điều đó như thế nào khi hàm là một hàm ẩn danh? như trong ......... sau đó (hàm (dữ liệu) {....})
David V.

1
Có một phương pháp tương tự để xác định các biến toàn cục không? Tôi đang tham chiếu đến một thư viện bên ngoài trong ứng dụng web của mình, tôi cần sử dụng những thứ như vậy MediumEditor, nhưng intellij đưa ra cho tôi cảnh báo về biến nổi tiếng chưa được giải quyết.
borislemke

@borislemke: câu trả lời này sẽ không hoạt động đối với các biến không phải là tham số. Giải pháp chung là sử dụng @namespace .
Dan Dascalescu

45

JSDoc đối tượng. Sau đó, các thành viên của nó.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property cho các biến cục bộ (không phải tham số)
  • Đã thử nghiệm trong PyCharm. @Nicholi xác nhận nó hoạt động trong Webstorm.
  • Các {{ member:type }}Andreas cú pháp gợi ý có thể xung đột với Django mẫu.
  • Cảm ơn câu trả lời của Jonny Buchanan đã trích dẫn @param wiki .

Để ghi lại các mảng đối tượng , hãy sử dụng []dấu ngoặc như JSDoc đề xuất :

/**
 * @param data
 * @param data.array_member[].foo
 */

Điều gì về các biến không phải là tham số? Giải pháp chung là sử dụng @namespace .
Dan Dascalescu

1
Tôi có thể xác nhận ký hiệu này cho các đối tượng phức tạp hoạt động trong WebStorm.
Nicholi

18

Tất cả các câu trả lời khác đều không chính xác đối với trường hợp chung. Nếu bạn không nhận được datadưới dạng tham số thì sao? Khi đó bạn không có JSDoc:

function niceApiCall(parameters) {
  const result = await ...  // HTTP call to the API here
  for (const e of result.entries) {
    .. // decorate each entry in the result
  }
  return result;
}

WebStorm sẽ cảnh báo rằng "result.entries" là một biến (trường) chưa được giải quyết.

Giải pháp chung là thêm một @namespacekhai báo:

function niceApiCall(parameters) {
  /** @namespace result.entries **/
  const result = await ...  // HTTP call to the API here
  for (const e of result.entries) {
    .. // decorate each entry in the result
  }
  return result;
}

2
Cảm ơn vì giải pháp này. Tôi có nhiều thuộc tính được trả về từ một API vì vậy bằng cách sử dụng kỹ thuật của bạn, tôi cho rằng tôi sẽ cần liệt kê rất nhiều thuộc tính trong số đó để tránh những lỗi mà tôi gặp phải như sau: `` / ** @namespace req.headers.signaturecertchainurl / / @ không gian tên req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` `` Có ​​cách nào để tạo không gian tên cấp cao hơn (ví dụ req.headers) và tự động gán con cho nó không? (xin lỗi vì không có định dạng trong nhận xét!)
James

@James: đó là một câu hỏi hay, và tôi cũng đã xem xét (không thành công) ít nhất là liệt kê nhiều hơn trên trường trên mỗi dòng.
Dan Dascalescu

6

sử dụng tệp js giả với biểu thức hàm ẩn danh trả về chữ json, như được viết tại http://devnet.jetbrains.com/message/5366907 , có thể là một giải pháp. Tôi cũng có thể đề xuất tạo một biến giả sẽ giữ giá trị json này và sử dụng var này làm giá trị của chú thích @param để cho WebStorm biết kiểu thực sự là gì. Giống:

var jsontext = {"some_unres_var":"val"};
/** @param {jsontext} data */
function getData(data){
    console.log(data.some_unres_var);
}

Xem thêm http://devnet.jetbrains.com/message/5504337#5504337


1
Đề xuất của Elena trên diễn đàn JetBrains là một giải pháp kỳ lạ . Giải pháp chung là sử dụng @namespace .
Dan Dascalescu

3

Phá hủy việc sử dụng, Luke.

function getData(data){
    const {member} = data;
    console.log(member);
}

-1

Để loại bỏ các cảnh báo trên WebStorm IDE, bạn chỉ cần bỏ chọn các tùy chọn kiểm tra cho:

  • Hàm Javascript chưa được giải quyết
  • Biến Javascript chưa được giải quyết

ps . điều này sẽ loại bỏ các cảnh báo trên IDE, nhưng tôi không nghĩ đó là ý tưởng tốt nhất, bởi vì chúng tôi sẽ mất một trong những tiện ích tốt nhất trong IDE như Webstorm, điều này có thể làm giảm chất lượng mã của chúng tôi.

Mặc dù vậy, nếu bạn muốn làm theo trong menu: Tệp > Cài đặt > Trình chỉnh sửa > Kiểm tra, chúng tôi có thể tắt cảnh báo Javascript

Như hình sau:

bỏ chọn các tùy chọn


Đây là một ý tưởng tồi, vì nó sẽ loại bỏ rất nhiều tính hữu ích của việc sử dụng IDE để chỉnh sửa JS. Vấn đề là việc sử dụng ký hiệu chấm JavaScript sẽ làm rối loạn việc kiểm tra, chứ không phải là việc kiểm tra nên bị vô hiệu hóa.
Will Harris
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.