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

sup*_*key 2 promise typescript fetch-api

我正在为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>?
}
Run Code Online (Sandbox Code Playgroud)

为什么可以直接返回Promise<any>as Promise<Bar>?这不应该需要某种类型的断言吗?

Tit*_*mir 6

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

由于引入了3.0打字稿unknown(更多内容请参见此处),因为它可以为它分配任何内容,因此如果没有类型断言,就不能将其分配给其他任何东西。所以这是一个错误:

let u: Promise<unknown>
let n: Promise<number> = u; // error
Run Code Online (Sandbox Code Playgroud)

您可能还会查看tslint规则no-unsafe-anyno-any这些规则会阻止any在项目中使用tslint规则,具体取决于您要使用banning的程度any,就像我刚开始所说的那样,我会完全禁止使用它,并在少数情况下添加exception必要。