Typescript异步函数返回类型void vs Promise<;无效>;

Typescript异步函数返回类型void vs Promise<;无效>;,typescript,Typescript,typescript void和Promise类型之间有区别吗 问是因为我弄糊涂了为什么这是一个有效的打字脚本 const asyncFunc: () => void = async () => { await new Promise(resolve => resolve()); }; 这不是唯一有效的案例吗 const asyncFunc: () => Promise<void> = async () => { await new P

typescript void和Promise类型之间有区别吗

问是因为我弄糊涂了为什么这是一个有效的打字脚本

const asyncFunc: () => void = async () => {
    await new Promise(resolve => resolve());
};
这不是唯一有效的案例吗

const asyncFunc: () => Promise<void> = async () => {
    await new Promise(resolve => resolve());
};
constasyncfunc:()=>Promise=async()=>{
等待新的承诺(resolve=>resolve());
};

是的,有区别

空虚有点像任何事物的反面:根本没有任何类型。您通常会将其视为不返回值的函数的返回类型

我想,
Promise
不需要解释


为什么问题中的作业是允许的?因为目标函数(
()=>void
)可以在所有(*几乎)与源函数相同的情况下调用。请看一个简化的示例:

declare let voidFunc: () => void;
declare let promiseFunc: () => Promise<void>;

voidFunc = promiseFunc; // OK
promiseFunc = voidFunc; // Error: Type 'void' is not assignable to type 'Promise<void>'
declare let voidFunc:()=>void;
声明让promiseFunc:()=>承诺;
voidFunc=promiseFunc;//好啊
promiseFunc=voidFunc;//错误:“void”类型不可分配给“Promise”类型
这也可以使用(请注意,这甚至不是一个异步函数):

const asyncFunc:()=>void=()=>{
return Math.random()>0.5?'hello':'world';
};
//或者这个:
常量asyncFunc2:()=>void=()=>{
返回{nice:'very'};
};
为什么??基本上,您可以让typescript自己解释类型,或者将特定类型设置为常量

在这里,您定义了一个名为
asyncFunc
,类型为
()=>void
。这意味着typescript在定义类型时将忽略函数的返回值。假设用户不期望值,那么返回值仍然可以正常工作,并且不会破坏代码

那么,
asyncFunc
的类型是什么?? 如果您自己定义常量的类型,则类型将为
()=>void
,因此用户不会期望任何返回值:

但是如果让typescript自己解释,它应该知道正确的值。 因此,对于上面定义的函数(没有异步),它将是
()=>string

那你该怎么办? 特别是在将函数定义为
()=>void
的情况下,函数根本不会检查返回值,您可以返回任何内容(甚至是承诺)。 将函数定义为async只需将返回值包装在一个promise中,
()=>void
类型将忽略该promise

如果要定义不同于解释类型的返回值类型,可以定义一个异步函数来返回具有嵌套类型的特定承诺

以下是您的示例:

constasyncfunc:()=>Promise=async()=>{
等待新的承诺(resolve=>resolve());
};
问题是,这将在没有类型定义的情况下自动发生:

所以这是相当多余的。您可以让typescript解释这些类型,除非您想将返回类型更改为其他类型

因此,在可能返回
hello
world
的示例中,我们可能希望让用户知道返回值可以是任何字符串,而不是这两个值。 然后,将返回值的定义更改为其他内容是有意义的:


您可以组合其中任何一个来实现您喜欢的工作流,但是请注意,
()=>void
是此类型系统的一种特殊情况(因为除了
void
之外的任何其他返回值都会抛出类型错误。

当您使用
声明变量时()=>void
type,你基本上是说它可以是任何函数。所以它的值(函数)可以返回任何东西。看一下。我给你放了几个函数实现,看看声明一个接收函数的变量不同于声明一个函数本身。 声明函数本身具有预期的行为

const asyncFunc:()=>void=async()=>{
等待新的承诺(resolve=>resolve());
};
常量asyncFunc2:()=>Promise=async()=>{
等待新的承诺(resolve=>resolve());
};
常量asyncFunc3=async()=>{
等待新的承诺(resolve=>resolve());
};
//TS编译器对此表示不满
异步函数asyncFunc4():void{
等待新的承诺(resolve=>resolve());
}
异步函数asyncFunc4():承诺{
等待新的承诺(resolve=>resolve());
}
编辑: 找不到什么解释。它也可以帮助你理解它。它说:

对其值将被忽略的回调使用返回类型void。 原因:使用void更安全,因为它可以防止您意外地以未经检查的方式使用x的返回值


太好了!你用比我少得多的话解释了同样的事情:-)喜欢这个解释!