打字稿定义文件交集类型函数签名

时间:2017-08-18 05:44:29

标签: typescript

我偶然发现了一个带有一些交集类型函数签名的打字稿定义文件。它们来自文件@types/cropppie中的index.d.ts

result(options: ResultOptions & { type: 'base64' }): Promise<string>;
result(options: ResultOptions & { type: 'html' }): Promise<HTMLElement>;
result(options: ResultOptions & { type: 'blob' }): Promise<Blob>;
result(options: ResultOptions & { type: 'canvas' }): Promise<HTMLCanvasElement>;
result(options?: ResultOptions): Promise<HTMLCanvasElement>;

我无法使用result调用函数type: 'base64',因此typescript编译器正确地将返回值标识为Promise<string>

当调用

const opts = new ResultOptions(...);
result({...opts, ...{type: 'base64'}}).then(data => ...);

typescript编译器将data标识为HTMLCanvasElement,但确实是base64编码的字符串。

有人可以指出如何正确传递参数,因此typescript编译器会将data标识为字符串吗?

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

我猜这个问题与准备传递给结果函数的params的方式有关。我已经改变了一点这个准备,看起来你提到的代码开始工作了。而不是:

{...opts, ...{type: 'base64'}}

我写道:

{ ...opts, type: 'base64' }

您可以在Playground site上查看我的示例。

以下是该示例的完整代码:

class ResultOptions {
    param1: any;
}

class ClassA {
    result(options: ResultOptions & { type: 'base64' }): Promise<string>;
    result(options: ResultOptions & { type: 'html' }): Promise<HTMLElement>;
    result(options: ResultOptions & { type: 'blob' }): Promise<Blob>;
    result(options: ResultOptions & { type: 'canvas' }): Promise<HTMLCanvasElement>;
    result(options?: ResultOptions): Promise<HTMLCanvasElement>;
    result(options?: ResultOptions): Promise<any> {
        if ((options as any).type === "base64") {
            return new Promise<string>(
                (resolve) => {
                    resolve("some string");
                }
            );

        } else {
            return new Promise<any>(
                (resolve) => {
                    resolve({});
                }
            );
        }
    }
}

const opts = new ResultOptions();
const instanceA = new ClassA();
instanceA.result({ ...opts, type: 'base64' })
    .then(
        (data: string) => {
            alert("data(string): " + data);
        }
    );

instanceA.result(opts)
    .then(
        (data: any) => {
            alert("data(any): " + data);
        }
    );