You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为文件选择器组件定义基于multiple属性的类型化onChange接口?

实现根据multiple属性自动推断onChange参数类型的方案

你原来的写法无法生效,因为在接口内部不能直接引用自身属性作为条件类型的判断依据。要实现根据multiple的布尔值自动确定onChange的参数类型,有两种常用方案:

方案一:泛型结合条件类型

通过泛型参数约束multiple的类型,再用条件类型推导onChange的参数类型:

export interface FilePickerProps<T extends boolean = false> {
  multiple?: T;
  onChange: T extends true ? (selectedFiles: File[]) => void : (selectedFiles: File) => void;
}

使用示例

  • 单文件上传(默认情况,无需指定泛型):

    const singleFilePicker = {
      onChange: (file) => {
        // file类型自动推断为File
        console.log("选中文件:", file.name);
      }
    } satisfies FilePickerProps;
    
  • 多文件上传(指定泛型为true):

    const multiFilePicker = {
      multiple: true,
      onChange: (files) => {
        // files类型自动推断为File[]
        console.log("选中文件数量:", files.length);
      }
    } satisfies FilePickerProps<true>;
    

方案二:联合类型

直接定义两种互斥的属性组合,让TypeScript自动进行类型校验:

export type FilePickerProps = 
  | { multiple?: false; onChange: (selectedFiles: File) => void }
  | { multiple: true; onChange: (selectedFiles: File[]) => void };

使用示例

这种方式会强制multiple和onChange的类型匹配,不允许出现不一致的情况:

// 正确:单文件配置
const validSinglePicker = {
  multiple: false,
  onChange: (file: File) => {}
} satisfies FilePickerProps;

// 正确:多文件配置
const validMultiPicker = {
  multiple: true,
  onChange: (files: File[]) => {}
} satisfies FilePickerProps;

// 错误:multiple为true但onChange参数类型不匹配,TypeScript会报错
const invalidPicker = {
  multiple: true,
  onChange: (file: File) => {}
} satisfies FilePickerProps;

方案对比

  • 泛型方案更灵活,默认是单文件模式,适合大部分场景;
  • 联合类型方案更严格,能避免multiple和onChange类型不一致的错误,适合需要强约束的场景。

内容的提问来源于stack exchange,提问作者Bruna Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:10:09