jsLint reports an unusual assignment error during type casting

When coding in JS, I rely on both the google-closure compiler and jsLint tool. The closure compiler requires proper JSDoc tags to avoid errors, which means I often need to cast variables to the correct type. The code below works fine with no compiler warnings, but when running jsLint, I receive a 'Weird assignment' error. Is there an alternative way to cast variables?

/** @return {Town|Village|Park|Metropolis} */
var getCurrentItem = function() {...some code}

var item = getCurrentItem();

if (condition)
{
    item = /** @type {Town} */ (item);  // 'Weird assignment' error occurs

    drawTown(item);
    updateTown(item)
}
else
{
    item = /** @type {Village} */ (item);  // 'Weird assignment' error occurs

    drawVillage(item);
    updateVillage(item)
}

I would like to find a way to handle casting in a single line rather than within each function call!

Answer №1

Allow me to share a few insights;

1) Take a cue from Writing Resilient Components/#marie-kondo-your-lint-config:

Here’s a suggestion for Monday. Gather your team for half an hour, review each lint rule enabled in your project’s configuration, and ask yourselves: “Has this rule ever helped us identify a bug?” If not, disable it.

2) Closure Compiler finds no issues with your code.

3) When necessary, double-cast like so:

drawVillage(/** @type {Village} */ (item));
updateVillage(/** @type {Village} */ (item));

4) To avoid repetition, consider creating a function that handles casting for you;

/** 
 * @param {Town|Village|Park|Metropolis} p
 * @return {boolean|Village}
 */
var getVillage = function(p) {
  if (p.somethingVillageSpecific) {
    return /** @type {Village} */ (p);
  } else {
    return false;
  } 
}

5) Use ES-lint along with jsdocs-plugin for linting.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Is the presence of an excessive number of arguments in the object that includes functions an instance

In my program, I have implemented a feature where the user can provide an array to determine which functions are executed in a loop. However, managing the list of variables that need to be passed into each function has become challenging as the list keeps ...

The javascript function ceases to operate once the div is refreshed

$(function() { $(".reqdeb").click(function() { console.log("Functioning properly"); var req_id = $(this).attr("id"); var info = 'id=' + req_id; if (confirm("Confirm deletion of request?")) { $.ajax({ cache : false, ...

The page abruptly jumps to the top whenever I display an ID element

Im currently facing an issue with my webpage where everything seems to be functioning properly, except for one problem. When I set a hidden element to be shown, the page suddenly jolts upwards. Although the previously concealed element is successfully disp ...

Animating positional changes with translate percentages in Android's native browser version 4.x

Lately, I've been developing a compact web application that incorporates the well-liked sidebar interaction design. In applying CSS3 animations to shift the sidebar into view, the animation glides smoothly but halts at the correct spot in the native b ...

Using ngFor directive to iterate through nested objects in Angular

Receiving data from the server: { "12312412": { "id": "12312412", "something": { "54332": { "id": "54332", "nextNode": { "65474&q ...

How can I increase the fading effect more and more with each call of the event using jQuery's fadeTo()?

I'm currently working on a script that is intended to gradually fade an image from 80% opacity to 1%, but every time I click, it goes straight to the set opacity. How can I make the fading effect continuous? Any help would be appreciated. Here is the ...

jQuery must provide the complete object rather than just the data within it

What is the best way to retrieve the entire <div class="loan_officer_apply_now_link"><a href="">APPLY NOW!</a></div> At present, only the "a" element content is being returned <a href="">APPLY NOW!</a> Test Code $( ...

Dividing an array into categories with typescript/javascript

Here is the initial structure I have: products = [ { 'id': 1 'name: 'test' }, { 'id': 2 'name: 'test' }, { 'id' ...

ReactJS: Checkbox status remains consistent through re-rendering of Component

I have developed a JSfiddle example Initially, this fiddle displays a list of checkboxes based on the passed props to the component. When you click the Re-render button, the same component is rendered with different props. Now, please follow these steps- ...

Are there any JavaScript alternatives to Python's pass statement that simply performs no action?

Can anyone help me find a JavaScript alternative to the Python: pass statement that does not implement the function of the ... notation? Is there a similar feature in JavaScript? ...

What could be causing the VueJS function not to be triggered by the dropdown selection?

I created a simple component called LocaleSwitcher.vue using the Element UI library: <template> <el-dropdown trigger="click"> <div> <i class="el-icon-map-location"></i> </div> < ...

The next promise in a promise chain does not wait for the previous promise to resolve

I am completely new to the concept of Promises, but I have read that they are a powerful tool for executing functions one after another through Promise chaining. The code snippet below, under //RUN ON CLICK: CREATE TABLES, makes two AJAX calls - "Create D ...

Consolidating multiple inputs into a single saved value

How can I combine three input values into one input field using onchange event in JavaScript? <script type="text/javascript"> function updateInput($i){ $('updateval').val($i); } </script> <input type="text" onchange="updat ...

What is the reason behind the momentary functionality of v-for?

I'm facing a strange issue while working with Vue.js. I'm not sure if the problem lies with my code or if it's a bug in the framework. Here's the scenario: When I use v-for with a comma before it (v-bind), there are no errors but nothi ...

Using ts-node throws an error when checking if window is equal to "undefined" using typeof

I encountered an issue with my code where I used typeof window == "undefined" to check for a browser environment. When running this code with ts-node, I ran into the following error: typings/Console.ts:36:10 - error TS2304: Cannot find name 'window&a ...

Issue with Discord.js reminder command: An expected numerical value was not provided

Hey there, I'm having an issue with my reminder command as it keeps giving me a TypeError: Expected a number if(command === "remind"){ let timeuser = args[0] let reason = args.slice(1).join(" ") // !remind 10m Dream Code Uploaded ...

Update the visibility of an element depending on the current date

I am creating a website for local use on my tablet and I prefer not to use PHP. I have multiple divs that should be shown on different days like this: - div 1 shows today - div 2 shows tomorrow - div 3 shows the day after tomorrow etc... I found some code ...

Discover a foolproof method for effortlessly examining an flv or mp4 file embedded within a webpage simply by

I've encountered a challenge with JavaScript. I can successfully check a flash object in a webpage when hovering over it, but I'm unsure how to achieve the same for flv or mp4 objects when either hovering over or moving away from them. Currently ...

What is the best way to convert HTML into a React component?

This is the situation I am facing : 1) The application requests a CMS (Content Management System) for page contents. 2) The CMS responds with "<div>Hi,<SpecialButton color="red">My Button</SpecialButton></div>" 3) The applicat ...

After combining two files in browserify, the error message "XXX.foo is not a function" appeared

When using browserify to bundle two JavaScipt files into one with the command: browserify X1.js X2.js --standalone XXX > bundle.js The file X1.js contains a function like this: function foo() { console.log("something") } And it is being exported i ...