Функция Typescript может вернуть Promise <any>как Promise <Bar>? - PullRequest
2 голосов
/ 25 марта 2019

Я создаю безопасную для типов оболочку для fetch-api, и я заметил, что компилятор машинописного текста классифицирует это как совершенно правильный код:

function foo(response: Response): Promise<Bar> { //response received from a fetch() call
    const json: Promise<any> = response.json();
    return json; //Promise<any> can be returned as Promise<Bar>?
}

Почему можно напрямую возвращать Promise<any> как Promise<Bar>?Разве это не требует какого-то утверждения типа?

Ответы [ 2 ]

6 голосов
/ 25 марта 2019

Всегда избегайте any. any по определению присваивается чему угодно и присваивается из чего угодно без каких-либо утверждений типа. При использовании в качестве аргумента универсального типа возвращаемый тип (например, Promise<any>) обычно может быть назначен любому другому экземпляру с любым другим аргументом типа в этой позиции (например, Promise<Bar>).

Поскольку в машинописи 3.0 введено unknown (подробнее см. здесь ), которое похоже на любое, в котором вы можете присвоить ему что-либо, оно не может быть назначено чему-либо другому без утверждения типа. Так что это ошибка:

let u: Promise<unknown>
let n: Promise<number> = u; // error

Вы могли бы также взглянуть на правила tslint no-unsafe-any и no-any, которые запрещают использование any в проекте, в зависимости от того, как далеко вы хотите пойти с запретом any, и, как я сказал в начале, я запретит его полностью и добавит исключения для тех немногих случаев, когда это абсолютно необходимо.

4 голосов
/ 25 марта 2019

Если что-то может быть any, то оно также может быть Bar.Если вы посмотрите на документацию Typescript для Basic Types , там написано (выделено мое)

Any

Возможно, нам потребуется описать тип переменных, которые мы делаемне знаю, когда мы пишем заявку.Эти значения могут поступать из динамического содержимого, например, из пользовательской или сторонней библиотеки.В этих случаях мы хотим отказаться от проверки типов и позволить значениям проходить проверку во время компиляции .Для этого мы помечаем их любым типом:

Это означает, что тип any полностью игнорирует проверки типов во время компиляции.

...