首页 > 解决方案 > 如何重用来自第 3 方 @types 模块的 TypeScript 联合类型?

问题描述

所以我是 TypeScript 的新手,想知道是否有办法重用来自第 3 方 @types 模块的联合类型。

例如,@types/node我们有以下用于缓冲区编码的联合类型:

// Buffer class
type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";

如果我有一个将值传递给Buffer.from()我的实用程序函数,我需要指定一个与“BufferEncoding”类型兼容的联合类型,我不能像这样使用“string”:

export function convertToBuffer(input: string | Buffer, encoding?: string): Buffer {
    if (input instanceof Buffer) return input;
    return Buffer.from(input, encoding);
}

显然,我可以复制并粘贴 BufferEncoding 类型,@types/node但这不会使我的代码保持干燥,并且不允许从@types/*模块导入。

export type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";

export function convertToBuffer(input: string | Buffer, encoding?: BufferEncoding): Buffer {
    if (input instanceof Buffer) return input;
    return Buffer.from(input, encoding);
}

我对使用“任何”类型或其他放松类型检查严格性的方法不感兴趣。我怀疑我要问的可能是不可能的,这很好。

标签: javascriptnode.jstypescripttypesunion-types

解决方案


因此,非常感谢 Aleksey 为我指明了正确的方向。事实证明,我在这里遇到了一些复杂的不同问题。

  1. Node 核心包的类型——它确实像运行一样简单npm install --save @types/node,然后BufferEncoding可以使用这些类型,而无需导入任何东西。
export function doSomething(encoding?: BufferEncoding): void { ... }
  1. 解构嵌套对象- 如果您使用解构或其他方式重新分配变量,TypeScript 编译器将无法推断变量的类型。

解构对象以提取我们需要的变量是一种常见的模式:

import errors from './errors';
const { http: { BadRequestError } } = errors;

export function doSomething(err: BadRequestError): void { ... }

但是,这会导致 TypeScript 编译器出现问题并给出以下错误:

  • 'BadRequestError' refers to a value, but is being used as a type here. ts(2749)
  • Parameter 'err' of exported function has or is using private name 'BadRequestError'. ts(4078)

解决方案是避免重新分配并直接引用变量:

import errors from './errors';

export function doSomething(err: errors.http.BadRequestError): void { ... }

推荐阅读