正确的Uppy插件类型声明

时间:2019-06-12 05:49:03

标签: reactjs typescript

目前,Uppy不能正确执行传递给其插件的选项类型,我正在尝试找出解决方法。

我正在使用以下组件:

import React from "react";
import Uppy from "@uppy/core";
import { DashboardModal } from "@uppy/react";
import AwsS3 from "@uppy/aws-s3";

interface Props {
  isOpen: boolean;
}

class WatermarkUppy extends React.Component<Props> {
  private uppy = Uppy({
    autoProceed: true,
  });

  constructor(props: Props) {
    super(props);

    this.uppy.use(AwsS3, {
      serverUrl: "/",
    });

    this.uppy.on("complete", response => {
      console.log(response);
    });
  }

  render() {
    const { isOpen } = this.props;

    return (
      <DashboardModal
        target={document.body}
        uppy={this.uppy}
        closeModalOnClickOutside
        open={isOpen}
        plugins={["AwsS3"]}
      />
    );
  }
}

export default WatermarkUppy;

如果我仅使用插件类名使用了不正确的调用,则选项对象看起来应该正确键入:

enter image description here

但是,一旦我传递了任何选项对象,推断出的类型就变成object,所以一切顺利:

enter image description here

该签名似乎来自here

Uppy AwsS3声明use的功能签名,如下所示:

declare module '@uppy/core' {
  export interface Uppy {
    use(pluginClass: typeof AwsS3, opts: Partial<AwsS3.AwsS3Options>): Uppy.Uppy;
  }
}

可以找到来源here

我想知道我导入的不是正确的还是输入的类型不正确,以便我可以提交补丁。谢谢!

编辑:它似乎确实需要做一些重载。在传递与Partial<AwsS3.AwsS3Options>类型匹配的对象时,可以正确推断出这些类型:

enter image description here

如果传递的对象具有不同的接口,则默认为object。另外,如果我注释掉第一个定义,则将强制执行选项类型:

use<T extends typeof Plugin>(pluginClass: T, opts: object): Uppy;

现在,应该如何编写这些键入内容,以便在使用AwsS3类时要求用户使用Partial<AwsS3.AwsS3Options>选项?

0 个答案:

没有答案