在http://devexpress.github.io/testcafe/documentation/getting-started/的Testcafe入门指南之后,我无法修改示例测试脚本。
打字稿版本:2.7.2节点版本:8.7.0 Webstorm版本:2017.2.6
import {Selector} from 'testcafe';
fixture `Getting Started`
.page `http://some-website.com`;
test('Test', async t => {
})
这编译并运行正常。我已经读过Typescript支持字符串模板,并且示例测试已经使用反引号来包围它的字符串,所以我尝试将URL的一部分分解出来:
import {Selector} from 'testcafe';
let domain = 'some-website.com';
fixture `Getting Started`
.page `http://${domain}`;
test('Test', async t => {
})
这导致错误“TS2554:预期1个参数,但得到2”,webstorm突出显示从fixture(
开始的两行代码。
尝试用变量完全替换.page
的参数会导致不同的编译错误。
import {Selector} from 'testcafe';
let domain:string = 'premierrange-local.com';
let str:string = `http://${domain}`;
fixture `Getting Started`
.page str;
test('Test', async t => {
})
“TS1005: ';'预期。”关于str
变量用法。
但是,将str
括在括号中可以解决编译错误:
import {Selector} from 'testcafe';
let domain:string = 'premierrange-local.com';
let str:string = `http://${domain}`;
fixture(`Getting Started`)
.page(str);
test('Test', async t => {
})
这编译并运行正常。因此,如果传递一个变量,似乎需要page
的参数括号,但如果字符串文字是?但我的第一次尝试只是引入了一个变量插值,它被视为编译错误。
page()
的定义如下(来自node_modules/testcafe/ts-defs/index.d.ts
):
page(url: string | TemplateStringsArray): this;
有人可以解释为什么Typescript认为我的第一次修改是非法的吗?
答案 0 :(得分:2)
标记模板通常具有two parameters,第一个参数将包含sting文字,第二个参数将是spread参数,并将包含替换值。
function tagged(url: TemplateStringsArray, ...values:any[]){
return "url";
}
let d = tagged `ss ${0}`; // conceptually equivalent to tagged(["value ", " (s)"], 0);
虽然这是常用方法,但我们可以使用定义,因为标记模板等同于函数调用,我们可以使用标记模板的参数,而typescript编译器将检查它们的兼容性
function tagged(url: TemplateStringsArray, ...values:number[]){
return "url";
}
let v1 = 0;
let v2 = ''
let d = tagged `value ${v1} ${v2}(s)`; // error, replacement values must be numbers and v2 is a string
对于testcafe
函数,只有一个参数,第一个参数,因此替换值没有参数,因此即使我们可以使用标记模板语法来调用{{1没有参数可以接受替换值,因此任何替换值都会产生错误。我认为page
的设计者只是想使用标记语法,但不一定要在字符串中执行任何替换。
您可以使用对testcafe
的常规函数调用来调用page
来解决此限制:
page