函数参数中的模板插值导致TS2554:预期的1个参数,但得到2

时间:2018-03-23 04:07:24

标签: typescript testcafe

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认为我的第一次修改是非法的吗?

1 个答案:

答案 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