使用全局URL变量作为类型

时间:2017-01-14 12:26:51

标签: typescript

我想返回一个URL对象,以便使用其createObjectURL函数:

public static getGlobalUrl(): URL {
    return window.URL || (<any>window).webkitURL;
}

lib.d.ts中URL的定义不包含createObjectURL。相反,它的定义如下:

interface URL {
    hash: string;
    host: string;
    hostname: string;
    href: string;
    readonly origin: string;
    password: string;
    pathname: string;
    port: string;
    protocol: string;
    search: string;
    username: string;
    toString(): string;
}

declare var URL: {
    prototype: URL;
    new(url: string, base?: string): URL;
    createObjectURL(object: any, options?: ObjectURLOptions): string;
    revokeObjectURL(url: string): void;
}

是否有可能以某种方式使用声明的变量作为我的函数的返回类型,或者我是否必须声明我自己的扩展URL的接口?如果是这样,为什么lib.ts不包含这样的派生接口?

编辑以使其更清晰

export class Utils {
    // This is a DRY way to get URL:
    public static getGlobalUrl(): IUrlWithStatic {
        return window.URL || (<any>window).webkitURL;
    }
}

// lib.d.ts URL does not contain createObjectURL so lets make our own 
// interface: 
export interface IUrlWithStatic extends URL {
    createObjectURL(object: any, options?: ObjectURLOptions): string;
}

// Here I use my Utils for DRY reasons in a typed manner:
Utils.getGlobalUrl().createObjectURL(myBlob);

我的问题:

我是否总是必须为这种功能声明我自己的接口,或者是否有一些内置的方法来使用在运行时确定的某些东西的静态方法(URL与webkitURL)如果已经有声明的话它以全局变量的形式出现。

2 个答案:

答案 0 :(得分:1)

URL.createObjectURL功能是静态的,您不需要URL的实例来使用它,因为它指出in MDN

  

URL.createObjectURL()静态方法创建一个包含的DOMString   表示参数中给出的对象的URL。

所以你可以这样做:

let url = URL.createObjectURL(myString);

在您发布的定义中也可以看到。
interface URL定义了URL实例的成员,而declare var URL定义了静态成员或URL类的成员。

修改

如果您要询问createObjectURLgetGlobalUrl()返回的值是否有interface URL { createObjectURL(object: any, options?: ObjectURLOptions): string; } URL.prototype.createObjectURL = function (object: any, options?: ObjectURLOptions): string { return URL.createObjectURL(object, options); } 可用,则无法执行此操作&#34;本地&#34;。
在javascript中,静态方法在实例上不可用。

然而,您可以自己实现它:

public static getGlobalUrl(): typeof URL {
    return window.URL || (<any>window).webkitURL;
}

第二次编辑

你可以这样做:

select * from user where status='0' order by rand() limit 100

答案 1 :(得分:0)

上述解决方案对我没有用,所以我根据MDN documentation创建了自己的类型:

export interface BrowserURL extends URL {
    createObjectURL(file: File | Blob | MediaSource)
}

const file = (window.URL as BrowserURL).createObjectURL(evt.target.files[0])