Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 函数参数中的模板插值导致TS2554:应为1个参数,但得到2个_Typescript_Testing_Automated Tests_E2e Testing_Testcafe - Fatal编程技术网

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

Typescript 函数参数中的模板插值导致TS2554:应为1个参数,但得到2个,typescript,testing,automated-tests,e2e-testing,testcafe,Typescript,Testing,Automated Tests,E2e Testing,Testcafe,按照Testcafe的入门指南,我在修改示例测试脚本时遇到了问题 Typescript版本: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支持字符串模板

按照Testcafe的入门指南,我在修改示例测试脚本时遇到了问题

Typescript版本: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 => {

})
变量用法的
str
上的“TS1005:”;“预期”

但是,将
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()
的定义如下(来自
node\u modules/testcafe/ts defs/index.d.ts
):


有人能解释为什么Typescript认为我的第一次修改是非法的吗?

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

您可以通过使用对
页面
的常规函数调用来调用
页面
,从而绕过此限制:

let site = 'some-website'
fixture `Getting Started`
    .page (`http://${site}.com`);

谢谢,我以前没有见过Typescript的“标记模板”功能。它的Testcafe使用似乎毫无意义,例如,他们的文档在显示
page()的正常函数调用时
而标记的模板调用是模棱两可的,但它们的模板字符串中没有参数。它们的示例是不必要的复杂,还是它们使用字符串模板的原因很好?@Neek我不知道它们的推理。从功能的角度看,这看起来毫无意义,我认为它们是在对se打电话来,但我不能确定。
let site = 'some-website'
fixture `Getting Started`
    .page (`http://${site}.com`);