基于条件参数值的函数返回类型



我有一个函数,它接受两个参数,根据第二个参数的值,返回字符串|undefined或缓冲区|undefine。

const readAsync = (path:string, returnAs?:"utf8"|"buffer") => {
const data = await FileSystem.readAsBuffer(path);
if (!data) return undefined; //Returns undefined
if (returnAs === "buffer") return data; //Returns buffer
return Buffer.from(data).toString(); //Returns a string
}

如果第二个参数没有被指定;utf8";,结果应该是Promise<string|undefined>,但是如果参数是"0";缓冲区";,则返回类型应该是Promise<缓冲区|未定义>。

然而,我得到的返回类型是Promise<string|Buffer|undefined>,这不是我想要的。

这是一个使用函数重载签名的例子:

async function readAsync (path: string, returnAs?: 'utf8'): Promise<string | undefined>;
async function readAsync (path: string, returnAs: 'buffer'): Promise<Buffer | undefined>;
async function readAsync (path: string, returnAs?: 'utf8' | 'buffer') {
// implementation of function
}
const result1 = readAsync('path'); // Promise<string | undefined>
const result2 = readAsync('path', 'utf8'); // Promise<string | undefined>
const result3 = readAsync('path', 'buffer'); // Promise<Buffer | undefined>

这可能通过泛型实现,但即使是,我认为这也会很难看。如果可能的话,我会用这种方式解决问题:

const readToBufferAsync(path: string): Promise<Buffer> => {
const data = await FileSystem.readAsBuffer(path);
if (!data) { return undefined; }
}
const readToStringAsync(path: string): Promise<string> {
const buffer = await readToBufferAsync(path);
return Buffer.from(data).toString();
}

您通常希望避免使用字符串类型的解决方案,例如将选项或标志作为字符串传递给函数。

最新更新