我正在用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();
,那么它将起作用。
我想念什么?
答案 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')
});
});