首页 文章

省略异步键入函数的返回

提问于
浏览
3

我们来看一个例子:

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 回答

  • 4

    明确提供 VoidAny 以外的返回类型的要点是您要确保类型安全 . 你隐含地告诉编译器你真的想要返回一些东西 . 那's why the compiler expects you to do this and complains when you don' t . 它在TypeScript规范_3000846中定义:

    显式类型函数,其返回类型不是Void类型,Any类型或包含Void或Any类型作为组成部分的union类型,其主体中必须至少有一个return语句

    至于你关于 return 的问题,你是对的 .

    return;return undefined; 具有相同的结果,由ECMAScript规范section 13.10定义:

    如果省略Expression,则返回值未定义 .

    省略 return 语句也具有相同的效果,如section 9.2.1中所定义 . 步骤11基本上表示如果没有返回任何其他内容,则返回 undefined (步骤9)或者没有抛出异常(步骤10) .

    因此,虽然您的示例在JavaScript中导致相同的结果(返回 undefined ),但它们对于TypeScript编译器在语义上是不同的(第二个例子不会返回任何内容) .

  • 1

    这与 async/await 无关,空返回被视为 return undefined . 所以这也有效:

    function foo(): string{
        return; // equivalent to return undefined;
    }
    

    如果使用 strictNullChecks ,则会收到错误,因为 undefined 无法分配给 string

    如果完全省略了返回,编译器会将返回类型推断为 void ,这与声明的 string 类型不同,因此这将是一个错误 . 如果函数是 async 并返回 Promise ,则同样适用

  • 2

    如果您不打算返回Promise,则必须使用 Promise<void> .

  • 1

    通过使用返回类型注释( : Promise<string> ),您说该函数将返回一些东西(可能在将来某个点解析为字符串的Promise),因此没有 return 语句的函数明显违反该注释/意图 .

    要将函数标记为不返回任何内容,可以使用注释 : void ,但这可能会导致不能将未定义强制转换为Promise的其他错误),因此在这种情况下 : Promise<void> 可能更合适 .

    在你的例子中你有一个空的 return 表达式并不重要,因为使用 async 函数,如果你返回一个非promise值,它将自动包装在一个promise中,所以 return; 仍然可以从编译器中找到透视 .

  • 1

    如果你真的想要进行严格的类型检查,你应该设置

    "strictNullChecks": true
    

    在你 tsconfig.json 文件中 .

    当你有这样的功能

    async function (): Promise<string> {
       return; // same as return undefined
    }
    

    如果您的 tsconfig.json 没有将“strictNullChecks”设置为true,那么编译将通过而不会出现错误 .

    检查docs/handbook/compiler-options.html

相关问题