我正在为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"
}
?这不应该需要某种类型断言吗?
答案 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-any
和any
,具体取决于您要禁止any
的程度,就像我刚开始所说的那样,我将完全禁止使用它,并在某些绝对必要的情况下添加例外。
答案 1 :(得分:4)
如果某物可以是any
,那么它也可以是Bar
。如果您查看Basic Types的Typescript文档,它会显示(强调我的意思)
任何
我们可能需要描述在编写应用程序时不知道的变量类型。这些值可能来自动态内容,例如来自用户或第三方库。在这种情况下,我们要退出类型检查,并让值通过编译时检查。为此,我们将它们标记为任何类型:
这意味着any
类型完全忽略了编译时类型检查。