【问题标题】:TypeScript - Function return type based on multiple parametersTypeScript - 基于多个参数的函数返回类型
【发布时间】:2020-10-15 20:16:07
【问题描述】:

我正在创建一个导出图像的函数。它需要采用formatexportTypepathOrWithMetadata 参数。我有以下代码:

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。如果是falseundefined,则需要返回一个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>

但是当pathOrWithMetadataundefined 时不起作用:

exportTo(image, "png", "buffer");

这里的返回类型是Promise&lt;ExportMetadata | Buffer&gt;。我怎样才能让返回类型为Promise&lt;Buffer&gt;

【问题讨论】:

    标签: javascript typescript types type-parameter


    【解决方案1】:

    我发现解决方案是为PathOrWithMetadata 设置一个默认值,如下所示:

    export default async function exportTo<ExportType extends ExportTypes, PathOrWithMetadata extends PathOrWithMetadataOptions = false>(...): Promise<Output<ExportType, PathOrWithMetadata>> { ... }
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 2023-03-30
      • 2017-06-01
      • 1970-01-01
      • 2022-11-04
      • 2020-10-27
      • 2020-04-27
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多