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<something>
,您可以在返回的承诺周围获得强类型。例如,您的 IDE 将知道 launchBrowser().then(...)
是有效的。 (由于使用了await
,TypeScript 可能会推断出其中的一些,但最好是明确的)。【参考方案2】:
在使用unknown
或any
之前,我会尝试查看npm @ types
中是否存在您的库的类型,看看是否可以在那里找到类型信息。
看起来puppeteer有几种类型:
npm install --save @types/puppeteer
至于你应该做什么,这取决于你。如果假设没有可用的类型,那么您可能会陷入困境。您可以创建自己的类型文件并通过 Typescript 的声明合并功能将其合并。但是,我建议不要这样做,因为
A.每次更新库时都必须更新类型文件,这很痛苦
B.如果您对库返回的类型不完全正确,您最终可能会感到非常困惑
我可能会把它留在unknown
或any
以使事情变得更容易。
编辑:更好的答案是遵循@Frank Modica 的答案并将结果包装在Promise 中,例如Promise<any>
或Promise<unknown>
。这至少提供了一些智能感知信息,并且比我之前所说的简单地将其定义为 any
或 unknown
好得多。
【讨论】:
为什么我应该使用 any 或 unknown 而不是不输入类型? 明确一点总是好的,尤其是在 Typescript 中。我建议遵循@Frank Modica 的答案并将其包装在 Promise 或 Promise以上是关于TypeScript:库函数的返回类型未知时该怎么办的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL:是不是有相当于 TypeScript 的“未知”?
返回具有额外属性的 arg 的 TypeScript 函数 (TS2322)