【发布时间】:2020-07-23 02:00:36
【问题描述】:
所以我是 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);
}
显然,我可以从 @types/node 复制并粘贴 BufferEncoding 类型,但这不会使我的代码保持干燥,并且不允许从 @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);
}
我对使用“any”类型或其他放松类型检查严格性的方法不感兴趣。我怀疑我所问的可能是不可能的,这很好。
【问题讨论】:
-
您不应该从
@types/*导入。只需使用BufferEncoding而不导入 - 它应该在节点环境中可用 -
** 安装一次
@types/node -
所以这适用于 Node 类型,但我无法让它适用于其他类型的包,我收到错误
Cannot find name 'X'.ts(2304)。这可能是我做错了什么还是我正在使用的类型包有问题? -
您应该定期导入的其他包中的类型
import { Foo } from 'bar'其中bar是包的名称
标签: javascript node.js typescript types union-types