【问题标题】:TypeScript: what to do when return type of library function is unknownTypeScript:库函数的返回类型未知时该怎么办
【发布时间】: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 还是不用类型?

【问题讨论】:

    标签: javascript node.js typescript node-modules


    【解决方案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.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多