请教Typescript筛选对象的问题?

来自antd upload的一个接口,如下:

interface UploadRequestOption<T = any> {
    onProgress?: (event: UploadProgressEvent) => void;
    onError?: (event: UploadRequestError | ProgressEvent, body?: T) => void;
    onSuccess?: (body: T, xhr?: XMLHttpRequest) => void;
    data?: Record<string, unknown>;
    filename?: string;
    file: Exclude<BeforeUploadFileType, File | boolean> | RcFile;
    withCredentials?: boolean;
    action: string;
    headers?: UploadRequestHeader;
    method: UploadRequestMethod;
}

我只需要保留file项为必须属性,其他可选,我首先想到的是:

Partial<UploadRequestOption>

那这样file就变成了可选,而Partial好像并不能像Pick那样能够接受第二个参数,如果要实现需求的话只能先把file拆出来,再合并成新的类型,如下:

type FileType = UploadRequestOption<ApiResponseType>['file'];
type OptionsType = Partial<Omit<UploadRequestOption<ApiResponseType>, 'file'>> & {
    file: FileType;
};

请问还有更简化的方式吗?

阅读 1.2k
1 个回答

完全可以自己封装个新的工具类型

type PartialOmit<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K>

使用:

type OptionsType<T> = PartialOmit<UploadRequestOption<T>, 'file'>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏