Интерполяция шаблона в аргументе функции приводит к TS2554: ожидается 1 аргумент, но получено 2

Следуя руководству по началу работы с Testcafe на странице http://devexpress.github.io/testcafe/documentation/getting-started/ У меня возникли проблемы с изменением образца сценария тестирования.

Версия 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 => {

})

"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 считает мои первые модификации незаконными?


person Neek    schedule 23.03.2018    source источник


Ответы (1)


Шаблоны с тегами обычно имеют два параметра, первый параметр будет содержать литералы sting, а второй параметр будет параметром распространения и будет содержать значения замены.

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`);
person Titian Cernicova-Dragomir    schedule 23.03.2018
comment
Спасибо, я не видел ранее описанной функции шаблонов с тегами в Typescript. Похоже, использование Testcafe бессмысленно, например их документы на devexpress .github.io / testcafe / documentation / test-api / показывают, что обычный вызов функции page() и вызов помеченного шаблона двусмысленны, но в их строке шаблона нет параметров. Их пример излишне сложен или есть веская причина, по которой они использовали строковый шаблон? - person Neek; 29.03.2018
comment
@Neek, я не знаю их аргументов ... это выглядит бессмысленным с функциональной точки зрения, я думаю, они собирались "директивно" взглянуть на эти звонки ... но я не могу сказать наверняка. - person Titian Cernicova-Dragomir; 29.03.2018