首页 > 解决方案 > 打字稿:使用多种类型调用重载

问题描述

我有一个类方法,它接受三种不同类型的值stringBufferUint8Array.

如果它不是 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
    }
  }
}

标签: node.jstypescript

解决方案


经过一番思考,我认为问题在于重载的编写方式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 的方法重载,它只需要这些类型中的一种。

如果有人有更好的答案,我很乐意听到。


推荐阅读