TypeScript:库函数的返回类型未知时该怎么办

Posted

技术标签:

【中文标题】TypeScript:库函数的返回类型未知时该怎么办【英文标题】:TypeScript: what to do when return type of library function is unknown 【发布时间】:2019-04-02 18:13:22 【问题描述】:

我是 TypeScript 的新手,我不知道在调用库函数/方法时要使用什么类型。例如,我在我的 Node.js 项目中使用了 headless chrome 模块。

import puppeteer = require("puppeteer");

async function launchBrowser () 
    const browser = await puppeteer.launch();

    return browser;


// In this case I do not know the return type of the launch method. What should I do?

async function launchBrowser (): Promise<any> 
    const browser: any = await puppeteer.launch();

    return browser;

我应该使用 any 还是不用类型?

【问题讨论】:

【参考方案1】:

假设你找不到你的库的类型,至少我会让函数返回一个承诺,因为你知道它是异步的。

较新版本的 TypeScript 引入了 unknown 类型:

async function launchBrowser (): Promise<unknown>

但你也可以返回any的承诺:

async function launchBrowser (): Promise<any>

查看文档以了解新的 unknown 类型:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

【讨论】:

为什么我应该使用 any 或 unknown 而不是不输入类型? 您可以确定的一件事是返回了一个承诺(因为它是一个异步函数)。因此,如果您将其键入为Promise&lt;something&gt;,您可以在返回的承诺周围获得强类型。例如,您的 IDE 将知道 launchBrowser().then(...) 是有效的。 (由于使用了await,TypeScript 可能会推断出其中的一些,但最好是明确的)。【参考方案2】:

在使用unknownany 之前,我会尝试查看npm @ types 中是否存在您的库的类型,看看是否可以在那里找到类型信息。

看起来puppeteer有几种类型:

npm install --save @types/puppeteer

至于你应该做什么,这取决于你。如果假设没有可用的类型,那么您可能会陷入困境。您可以创建自己的类型文件并通过 Typescript 的声明合并功能将其合并。但是,我建议不要这样做,因为

A.每次更新库时都必须更新类型文件,这很痛苦

B.如果您对库返回的类型不完全正确,您最终可能会感到非常困惑

我可能会把它留在unknownany 以使事情变得更容易。

编辑:更好的答案是遵循@Frank Modica 的答案并将结果包装在Promise 中,例如Promise&lt;any&gt;Promise&lt;unknown&gt;。这至少提供了一些智能感知信息,并且比我之前所说的简单地将其定义为 anyunknown 好得多。

【讨论】:

为什么我应该使用 any 或 unknown 而不是不输入类型? 明确一点总是好的,尤其是在 Typescript 中。我建议遵循@Frank Modica 的答案并将其包装在 Promise 或 Promise.

以上是关于TypeScript:库函数的返回类型未知时该怎么办的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:是不是有相当于 TypeScript 的“未知”?

TypeScript 3.x:访问未知类型的属性

返回具有额外属性的 arg 的 TypeScript 函数 (TS2322)

Typescript 无法检查函数返回类型的嵌套对象

GraphQL 类型在由 Relay 编译时在 Typescript 中被定义为未知

返回函数的通用 TypeScript 类型,将 ReturnType 替换为返回函数的 ReturnType