javascript - 如何重用来自第 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);
}
我对使用“任何”类型或其他放松类型检查严格性的方法不感兴趣。我怀疑我要问的可能是不可能的,这很好。
解决方案
因此,非常感谢 Aleksey 为我指明了正确的方向。事实证明,我在这里遇到了一些复杂的不同问题。
- Node 核心包的类型——它确实像运行一样简单
npm install --save @types/node
,然后BufferEncoding
可以使用这些类型,而无需导入任何东西。
export function doSomething(encoding?: BufferEncoding): void { ... }
- 解构嵌套对象- 如果您使用解构或其他方式重新分配变量,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 { ... }
推荐阅读
- powershell - 修改 PowerShell 脚本以显示 RecipientDetailsType 和 FullAccess 权限
- pandas - Python - 重塑,透视,取消堆叠 - 多索引
- python - 如果字符串中的字母是辅音,则将字母加倍并在中间放“o”,否则不是
- ios - 为 iOS 应用程序存储数据的最佳方式是什么,可以轻松管理数据
- javascript - 点击后更新 HTML 内容
- python - 使用合并单元重塑 Dataframe 熊猫
- python - 如何计算某个字符串在变量中出现的次数?
- react-native - 在没有 redux 的情况下重置导航
- mysql - MySQL 添加存储在用户定义变量中的两个二进制值
- c# - ODBC varchar(max) 参数似乎为 8000 个字符抛出“HY104 - 无效精度值”