Почему TypeScript жалуется, что параметр имеет неявный тип `any`, когда getCurrenUlr() возвращает `Обещание`?

#javascript #selenium-webdriver #typescript #protractor

#javascript #selenium-webdriver #typescript #транспортир

Вопрос:

Я использую protractor 4.x с TypeScript. Используя TypeScript 2.0 , компилятор жалуется в следующем тесте:

 it('should have url', done=>{
  browser.getCurrentUrl().then((x)=>{
    // do something with x
  })
})
  

Он говорит: error TS7006: Parameter 'x' implicitly has an 'any' type.
Да, я знаю, что могу отключить это в файле, tsconfig.json или явно установить тип, но мой реальный вопрос — почему?

Когда я навожу на browser.getCurrentUrl() него указатель мыши, это ясно говорит (property) Webdriver.getCurrentUrl: () => webdriver.promise.Promise<string> об этом, x должен неявно иметь тип string

Шаги воспроизведения

tsconfig.json (прямо из транспортира):

 {
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": false,
        "declaration": false,
        "noImplicitAny": true,
        "outDir": "tmp",
        "types": ["node", "jasmine"]
    },
    "exclude": [
        "node_modules",
        "asyncAwait",
        "plugins.ts"
    ]
}
  

Комментарии:

1. Не могли бы вы показать свое tsconfig.json содержимое?

2. добавит его, но это готовый tsconfig из примера транспортира.

3. Хорошо, но noImplicitAny false в вашей конфигурации установлено значение ..?

4. Извините, просто скопировал его с сайта. Исправляем это сейчас.

Ответ №1:

Причина этого в том, что вам нужно явно указать тип параметра x :

 it('should have url', done=>{
  browser.getCurrentUrl().then((x: string)=>{
    // do something with x
  })
})
  

Комментарии:

1. Не уверен, почему этот ответ был отклонен, когда он правильно отвечает на вопрос OP.

2. Да, я тоже умею читать. Но getCurrentUrl () возвращает введенное обещание Promise <string> , поэтому мне не нужно.

3. Но Typescript не понимает этого на данный момент. Что касается этого, он не видит тип, которому присвоен x , поэтому он интерпретирует его как «подразумеваемый any», что нарушает ваш tsconfig. Вы можете обойти это, либо явно указав x тип any, либо, если вы знаете, что он всегда будет возвращать a Promise<string> , тогда вы можете присвоить ему этот тип.

4. Насколько я знаю, TypeScript в настоящее время не может вывести типы из этого.

5. Это неверно. Следующее компилируется и работает просто отлично: Promise.resolve(‘data’) .then(x => { return x; });