3

按照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:Expected 1 arguments, but got 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 认为我的第一次修改是非法的吗?

4

1 回答 1

4

标记模板通常有两个参数,第一个参数将包含字符串文字,第二个参数将是扩展参数,将包含替换值。

function tagged(url: TemplateStringsArray, ...values:any[]){
    return "url";
}

let d = tagged `ss ${0}`; // conceptually equivalent to tagged(["value ", " (s)"], 0);

虽然这是通常的方式,但我们可以玩弄定义,因为标记模板等同于函数调用,我们可以玩弄标记模板的参数,打字稿编译器会检查它们的兼容性

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函数的情况下,只有一个参数,第一个,因此没有用于替换值的参数,因此即使我们可以使用标记模板语法来调用page,也没有参数来接受替换值,因此任何替换值都会产生错误。我认为设计者testcafe只是想使用标记语法,但不一定要在字符串中执行任何替换。

page您可以通过使用常规函数调用来解决此限制page

let site = 'some-website'
fixture `Getting Started`
    .page (`http://${site}.com`);
于 2018-03-23T06:03:06.917 回答