我们来看一个例子:
export async function foo(): Promise<string>{
await bar()
return;
}
它编译没有错误 .
然后,
export async function foo(): Promise<string>{
await bar()
}
导致错误
声明类型既不是'void'也不是'any'的函数必须返回一个值
1)为什么?
我猜这是https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#63-function-implementations
并使用async,typescript及其输入复杂化?
更新:
仅供参考,当函数 return;
没有 return
(或者甚至有 return undefined;
)时,从语义角度看它是相同的情况吧?
5 回答
明确提供
Void
或Any
以外的返回类型的要点是您要确保类型安全 . 你隐含地告诉编译器你真的想要返回一些东西 . 那's why the compiler expects you to do this and complains when you don' t . 它在TypeScript规范_3000846中定义:至于你关于
return
的问题,你是对的 .return;
和return undefined;
具有相同的结果,由ECMAScript规范section 13.10定义:省略
return
语句也具有相同的效果,如section 9.2.1中所定义 . 步骤11基本上表示如果没有返回任何其他内容,则返回undefined
(步骤9)或者没有抛出异常(步骤10) .因此,虽然您的示例在JavaScript中导致相同的结果(返回
undefined
),但它们对于TypeScript编译器在语义上是不同的(第二个例子不会返回任何内容) .这与
async/await
无关,空返回被视为return undefined
. 所以这也有效:如果使用
strictNullChecks
,则会收到错误,因为undefined
无法分配给string
如果完全省略了返回,编译器会将返回类型推断为
void
,这与声明的string
类型不同,因此这将是一个错误 . 如果函数是async
并返回Promise
,则同样适用如果您不打算返回Promise,则必须使用
Promise<void>
.通过使用返回类型注释(
: Promise<string>
),您说该函数将返回一些东西(可能在将来某个点解析为字符串的Promise),因此没有return
语句的函数明显违反该注释/意图 .要将函数标记为不返回任何内容,可以使用注释
: void
,但这可能会导致不能将未定义强制转换为Promise的其他错误),因此在这种情况下: Promise<void>
可能更合适 .在你的例子中你有一个空的
return
表达式并不重要,因为使用async
函数,如果你返回一个非promise值,它将自动包装在一个promise中,所以return;
仍然可以从编译器中找到透视 .如果你真的想要进行严格的类型检查,你应该设置
在你
tsconfig.json
文件中 .当你有这样的功能
如果您的
tsconfig.json
没有将“strictNullChecks”设置为true,那么编译将通过而不会出现错误 .检查docs/handbook/compiler-options.html