【问题标题】:Typescript definition file intersection type function signatureTypescript 定义文件交集类型函数签名
【发布时间】:2017-08-18 14:57:48
【问题描述】:

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

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>;

我无法使用type: 'base64' 调用函数result,因此打字稿编译器将返回值正确识别为Promise&lt;string&gt;

当被调用时

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

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

有人能指出如何正确传递参数,以便打字稿编译器将data 识别为字符串吗?

非常感谢。

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    {...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);
            }
        );
    

    【讨论】:

    • 哦,就这么简单。事实上,当我不使用另一个内部对象时,编译器会正确识别它。非常感谢您的出色回答,出色的工作!
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2017-08-23
    • 2017-11-24
    • 2017-12-16
    • 2018-07-18
    相关资源
    最近更新 更多