赛普拉斯自定义TypeScript命令不是函数

时间:2018-08-05 12:15:59

标签: typescript cypress

我正在用TypeScript实现自定义的Cypress:

// support/commands.js
const login = () => {
    console.log('Logging in...');
};

Cypress.Commands.add('login', login);

declare namespace Cypress {
    interface Chainable {
        login: typeof login;
    }
}

我尝试使用以下方式调用它:

describe('Login Scenario', () => {
    it('should allow a user to login', () => {
        cy.visit('/');
        cy.login();
    });
});

但是,似乎未设置命令:

  

TypeError:cy.login不是函数

如果我使用纯JavaScript编写命令(删除命名空间声明并将对调用的更新更新为(cy as any).login();,那么它将起作用。

我想念什么?

3 个答案:

答案 0 :(得分:5)

我通过在我的命令文件夹中添加index.d.ts文件来修复它。在此文件中,我添加了以下内容:

import { MyCustomType } from '../Types';

declare global {
  namespace Cypress {
    interface Chainable<Subject = any> {
      login(): Chainable<MyCustomType>;
    }
  }
}

如果您不导入或导出任何内容,则只需省略全局名称空间声明:

declare namespace Cypress {
  interface Chainable<Subject = any> {
    login(): Chainable<MyCustomType>;
  }
}

请记住,它不适用于Typesciprt <2.3,因为必须支持默认的泛型类型。

答案 1 :(得分:2)

我遇到了同样的问题,发现的所有解决方案都不适合我。在完成了赛普拉斯官方文档和其他解决方案的所有操作后,我仍然收到错误cy.login is not a function

问题是我将每个.js文件重命名为.ts,并且不再加载cypress/support/index.ts,因为默认情况下,赛普拉斯仅加载JavaScript。要修复它,您需要像这样(在插件文件中一样)将它在.ts中更改为cypress.json

{
  "supportFile": "cypress/support/index.ts",
  "pluginsFile": "cypress/plugins/index.ts"
}

您也可以将带有declare namespace Cypress {...的零件添加到commands.ts中,而不是创建一个index.d.ts文件,以在同一文件中声明和实现

答案 2 :(得分:0)

这是我使用的,我不必在每个文件的开头添加/// <reference types="cypress" />

我在<projectroot>/cypress/support/index.d.ts下有自己的自定义类型

/// <reference types="cypress" />

declare namespace Cypress {
  interface Chainable<Subject> {
    getByDataTest(tag: string): Chainable<any>
  }
}

我的<projectroot>/cypress/tsconfig.json看起来像

{
  "compilerOptions": {
    "strict": true,
    "baseUrl": "../node_modules",
    "target": "es5",
    "lib": ["es5", "dom"],
    "types": ["cypress"],
    "typeRoots": ["./support"]
  },
  "include": ["**/*.ts"]
}

TypeScript终于高兴了

describe('when I want to select by data test tag', () => {
  it('should select by data test tag', () => {
    cy.getByDataTest('yolo').should('exist')
  });
});