【发布时间】:2020-10-15 20:16:07
【问题描述】:
我正在创建一个导出图像的函数。它需要采用format、exportType 和pathOrWithMetadata 参数。我有以下代码:
interface ExportMetadata {
data: Buffer;
width: number;
height: number;
}
export type Format = "png" | "jpeg";
export type ExportTypes = "file" | "buffer";
export type Output<ExportType> = ExportType extends "file" ? undefined : Buffer;
export default async function exportTo<ExportType extends ExportTypes>(
image: Image,
format: Format,
exportType: ExportType,
pathOrWithMetadata?: string | boolean
): Promise<Output<ExportType>> { ... }
这将确保如果exportType 是"file",则将返回undefined。但如果exportType 是"Buffer",则将返回Buffer。现在,我需要 Buffer 返回类型依赖于 pathOrWithMetadata 参数。首先,如果exportType 是"file",则pathOrWithMetadata 必须是一个字符串。如果exportType 是"buffer",它需要是一个布尔值。如果布尔值为true,则返回类型需要为ExportMetadata。如果是false或undefined,则需要返回一个Buffer。
这是我尝试过的:
interface ExportMetadata {
data: Buffer;
width: number;
height: number;
}
export type Format = "png" | "jpeg";
export type ExportTypes = "file" | "buffer";
export type PathOrWithMetadataOptions = string | boolean;
export type Output<ExportType, PathOrWithMetadata> = ExportType extends "file" ? undefined : (PathOrWithMetadata extends true ? ExportMetadata : Buffer);
export default async function exportTo<ExportType extends ExportTypes, PathOrWithMetadata extends PathOrWithMetadataOptions>(
image: Image,
format: Format,
exportType: ExportType,
pathOrWithMetadata?: PathOrWithMetadata
): Promise<Output<ExportType, PathOrWithMetadata>> { ... }
这适用于以下用例:
exportTo(image, "png", "file", "example.png"); // Promise<undefined>
exportTo(image, "png", "buffer", true); // Promise<ExportMetadata>
exportTo(image, "png", "buffer", false); // Promise<Buffer>
但是当pathOrWithMetadata 是undefined 时不起作用:
exportTo(image, "png", "buffer");
这里的返回类型是Promise<ExportMetadata | Buffer>。我怎样才能让返回类型为Promise<Buffer>?
【问题讨论】:
标签: javascript typescript types type-parameter