Typescript函数可以将Promise <any>作为Promise <bar>返回吗?

时间:2019-03-25 20:29:43

标签: typescript promise fetch-api

我正在为fetch-api创建一个类型安全的包装器,并且我注意到打字稿编译器将其归类为完全有效的代码:

Promise<any>

为什么可以将Promise<Bar>直接返回为node { try { stage('Clean Up') { deleteDir() stage('Verify New Github Repo Exists') { sh 'git ls-remote git@github.com:account/${githubProject}.git' // check if repo exist stage('Clone Github Repo') { // clone into directory and cd sh 'git clone git@github.com:account/${githubProject}.git .' sh 'git remote -v' sh 'ls -lash' stage('Merge Template Into Project') { // add the template into the project sh 'git remote add template git@github.com:account/${appType}-jenkins-ci-template.git' sh 'git remote -v' // this shows both origin and template repos sh 'git fetch --all' sh 'git merge template/master' // able to merge origin's master with template's sh 'ls -lash' sh 'git log --graph --abbrev-commit --max-count=10' sh 'git push -u origin master' // when the code get here, it fails to push, ends up with ERROR: Repository not found. // do the work to replace all __APP_NAME__ with the actual app name/service // commit and push to master stage('Configure Project Properties') { // clone and copy property files from template project // do the work to replace all __APP_NAME__ with the actual app name/service // commit and push to master stage('Wrap Up') { // creating jenkins jobs will continue to be manual } } } } } } } catch (e) { //notifyFailure(e, "Script failure!") currentBuild.result = "FAILURE" } ?这不应该需要某种类型断言吗?

2 个答案:

答案 0 :(得分:6)

始终避免使用any。根据定义,any可以分配给任何对象,也可以分配给任何对象,而无需任何类型的断言。当用作通用类型参数时,重排类型(ex Promise<any>)通常可以分配给该位置上具有任何其他类型参数(ex {Promise<Bar>)的任何其他实例化。

由于3.0打字机引入了unknown(更多信息请阅读here),该打字机与任何打字机相似,因为您可以为其分配任何内容,因此如果没有类型断言,就不能将其分配给其他任何内容。所以这是一个错误:

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

您可能还会查看禁止在项目中使用no-unsafe-any的tslint规则no-anyany,具体取决于您要禁止any的程度,就像我刚开始所说的那样,我将完全禁止使用它,并在某些绝对必要的情况下添加例外。

答案 1 :(得分:4)

如果某物可以是any,那么它也可以是Bar。如果您查看Basic Types的Typescript文档,它会显示(强调我的意思)

  

任何

     

我们可能需要描述在编写应用程序时不知道的变量类型。这些值可能来自动态内容,例如来自用户或第三方库。在这种情况下,我们要退出类型检查,并让值通过编译时检查。为此,我们将它们标记为任何类型:

这意味着any类型完全忽略了编译时类型检查。