2

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

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>?
}

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

4

2 回答 2

7

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

由于引入了 3.0 打字稿unknown(请阅读此处了解更多信息),它与 any 类似,您可以为其分配任何东西,因此如果没有类型断言,它就不能分配给其他任何东西。所以这是一个错误:

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

您可能还可以查看 tslint 规则no-unsafe-anyno-any阻止any在项目中使用,这取决于您想使用 banning 多远any,就像我在开始时所说的那样,我会完全禁止它并为少数情况添加例外绝对是必要的。

于 2019-03-25T20:36:29.557 回答
4

如果某事物可以是any事物,那么它也可以是Bar. 如果您查看基本类型的 Typescript 文档,它会说(强调我的)

任何

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

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

于 2019-03-25T20:36:47.453 回答