javascriptangulartypescriptprotractorbrowserstack

Unable to declare onComplete function in Conf.ts >>Getting error -- Type '(passed: any) => void' is not assignable to type '() => void'.ts(2322)


I am working on a Protractor - browserstack framework from scratch.

While using onComplete function as mentioned on the site in conf.ts - https://automate.browserstack.com/dashboard/v2/quick-start/get-started#introduction

 // Code to mark the status of test on BrowserStack based on test assertions
      onComplete: function (passed) {
        if (!passed) {
          browser.executeScript('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"failed","reason": "At least 1 assertion has failed"}}');
        }
        if (passed) {
          browser.executeScript('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"passed","reason": "All assertions passed"}}');
        }
      }

I'm getting below error on Console

*Debugger attached. conf.ts:87:1 - error TS2322: Type '(passed: any) => void' is not assignable to type '() => void'. 87 onComplete: function (passed) {

node_modules/protractor/built/config.d.ts:410:5
 410     onComplete?: () => void;
         ~~~~~~~~~~
 The expected type comes from property 'onComplete' which is declared here on type 'Config'*



Can someone help me understand how to resolve this error?

Solution

  • This looks like a bug in the type definitions for onComplete. In the usage it looks like the onComplete is passed a variable. See: https://github.com/angular/protractor/blob/master/lib/frameworks/jasmine.js#L109-L115

    const originalOnComplete = runner.getConfig().onComplete;
    
    jrunner.onComplete(async(passed) => {
      try {
        if (originalOnComplete) {
          await originalOnComplete(passed);
        }
    

    Although you could create a TypeScript config.ts, it might be better to create a config.js file. Using config.ts could also run into problems when you want to reference the browser object. The browser variable would have to be brought in via require instead of import.