node.js - 打字稿:使用多种类型调用重载
问题描述
我有一个类方法,它接受三种不同类型的值string
:Buffer
和Uint8Array
.
如果它不是 Buffer,我想将类型转换为 Buffer,所以我检查它是否不是Buffer using !Buffer.isBuffer(...)
,然后尝试将其转换为 Buffer using Buffer.from(...)
,它应该接受其余类型中的任何一种(string
| UInt8Array
)。
不幸的是,Typescript 认为我正在尝试将 a 转换UInt8Array
为 a string
,而我显然不是,因此我必须添加手动typeof
检查以使其满意。
有一个更好的方法吗?
public send(data: string | Buffer | Uint8Array): void {
if (!Buffer.isBuffer(data)) {
if (typeof data === 'string') {
data = Buffer.from(data); // string
} else {
data = Buffer.from(data); // Uint8Array
}
}
}
解决方案
经过一番思考,我认为问题在于重载的编写方式Buffer.from(...) type annotations on the DefinatelyTyped repository
declare function bufferFrom(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
declare function bufferFrom(str: string, encoding?: string): Buffer;
declare function bufferFrom(data: ReadonlyArray<any> | Buffer): Buffer;
在 Javascript 中,它会处理ArrayBuffer | string | ReadOnlyArray<any>
(实际上any
),但由于 Typescript 的方法重载,它只需要这些类型中的一种。
如果有人有更好的答案,我很乐意听到。
推荐阅读
- powershell - 如何使用 PowerShell 检查文件包含并重命名它?
- css - 比较 2 css 样式 - 属性和值相等
- regex - 查找带有可选前导零但不以其他数字开头的数字
- python - 如何获得 64 位 Anaconda Python 以在 Windows 上找到用于 Cython 的 MS C 编译器?
- html - 如何删除 HTML/CSS 中两个 div 之间的空格?
- angular - 单击对话框覆盖(PrimeNG)时如何设置z-index?
- jpa - Netbeans 是否正确创建“等于”方法?
- wpf - 是否有带有绿色箭头图标的选择控件?
- python - 如何有效地将所有行的 z 值与相同的 x 和 y 值进行比较?
- asp.net - 手动填充的 GridView 是否可以有不同的标题标题?