Typescript函数可以返回承诺<;任何>;作为承诺<;巴>;?

Typescript函数可以返回承诺<;任何>;作为承诺<;巴>;?,typescript,promise,fetch-api,Typescript,Promise,Fetch Api,我正在为fetch api创建一个类型安全包装器,我注意到typescript编译器将其归类为完全有效的代码: 函数foo(response:response):Promise{//response从fetch()调用接收 const json:Promise=response.json(); return json;//承诺可以作为承诺返回吗? } 为什么可以直接将承诺作为承诺返回?这难道不需要某种类型的断言吗?始终避免任何类型的断言any可分配给任何对象,也可从任何对象分配,而无需任何类型

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

函数foo(response:response):Promise{//response从fetch()调用接收
const json:Promise=response.json();
return json;//承诺可以作为承诺返回吗?
}

为什么可以直接将
承诺作为
承诺
返回?这难道不需要某种类型的断言吗?

始终避免
任何类型的断言<根据定义,code>any
可分配给任何对象,也可从任何对象分配,而无需任何类型的断言。当用作泛型类型参数时,resuting类型(ex
Promise for more)类似于任何类型,因为您可以为其分配任何内容,但在没有类型断言的情况下,它不能分配给任何其他内容。这是一个错误:

let u: Promise<unknown>
let n: Promise<number> = u; // error
让你:承诺
设n:Promise=u;//错误

您还可以查看tslint规则
no-unsafe-any
no-any
,这些规则阻止在项目中使用
any
,具体取决于您希望禁止
any
的程度,正如我在开始时所说的,我会完全禁止它,并在少数绝对必要的情况下添加例外情况。

如果某个东西可以是
任何
东西,它也可以是
。如果你看一下Typescript文档,上面写着(我的重点)

任何 我们可能需要描述在编写应用程序时不知道的变量类型。这些值可能来自动态内容,例如来自用户或第三方库。在这些情况下,我们希望选择退出类型检查,并让值通过编译时检查。要做到这一点,我们可以使用任何类型的标签:


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

这很有意义。
Body.json()
返回的是
Promise
而不是
Promise
,这有什么原因吗?@superbadcodemonkey如果返回,会破坏很多代码。在
lib.d.ts
中添加了一个选项来使用
unknown
而不是
any
,但是我现在找不到它,我认为它不会很快实现。