Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用全局URL变量作为类型_Typescript - Fatal编程技术网

Typescript 使用全局URL变量作为类型

Typescript 使用全局URL变量作为类型,typescript,Typescript,我想返回一个URL对象,以便使用其createObjectURL函数: public static getGlobalUrl(): URL { return window.URL || (<any>window).webkitURL; } 是否可以以某种方式使用声明的变量作为函数的返回类型,还是必须声明自己扩展URL的接口?如果是这样,为什么lib.ts不包含这样一个派生接口 编辑以使其更清晰 export class Utils { // This is a DR

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

public static getGlobalUrl(): URL {
    return window.URL || (<any>window).webkitURL;
}
是否可以以某种方式使用声明的变量作为函数的返回类型,还是必须声明自己扩展
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);
导出类Utils{
//这是获取URL的一种简单方法:
公共静态getGlobalUrl():IUrlWithStatic{
return window.URL | |(window).webkitURL;
}
}
//lib.d.ts URL不包含createObjectURL,因此让我们自己创建
//接口:
导出接口IUrlWithStatic扩展URL{
createObjectURL(对象:任意,选项?:ObjectURLOptions):字符串;
}
//在这里,我以键入的方式出于干燥原因使用UTIL:
Utils.getGlobalUrl().createObjectURL(myBlob);
我的问题:


我是否总是必须为此类功能声明我自己的接口,或者如果已经以全局变量的形式声明,是否有某种内置方式来使用运行时确定的静态方法(URL vs.webkitURL)。
URL.createObjectURL
函数是静态的,使用它不需要
URL
的实例,因为它声明:

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

所以你可以做:

let url = URL.createObjectURL(myString);
它也可以在您发布的定义中看到。
接口URL
定义URL实例的成员,而
声明变量URL
定义静态成员或
URL
类的成员


编辑 如果您询问如何在从
getGlobalUrl()
返回的值上使用
createObjectURL
,则无法“本机”执行此操作。
在javascript中,静态方法在实例上不可用

但是,您可以自己实现它:

interface URL {
    createObjectURL(object: any, options?: ObjectURLOptions): string;
}

URL.prototype.createObjectURL = function (object: any, options?: ObjectURLOptions): string {
    return URL.createObjectURL(object, options);
}

第二版 您可以这样做:

public static getGlobalUrl(): typeof URL {
    return window.URL || (<any>window).webkitURL;
}
public静态getGlobalUrl():URL的类型{
return window.URL | |(window).webkitURL;
}

上述解决方案不适用于我,因此我根据以下内容创建了自己的类型:


您所要做的就是能够调用
createObjectURL
,并为此尝试创建
URL
的实例?不清楚你在干什么asking@NitzanTomer我想做
MyClass.getGlobalUrl().createObjectURL(myString)
URL.createObjectURL
是静态的,更多信息请参见我的答案。我认为这个答案是“你不可能从盒子里得到你想要的。”也许我不明白你在追求什么。我认为您希望能够调用
createObjectURL
。如果不是这样的话,那你想做什么?我重新阅读了你的问题,试图理解你的问题,并认为也许我理解。检查我更新的答案,希望我猜对了。我也更新了我的问题,但你已经明白我的意思:)我想我会坚持我的自定义界面。不。如果您返回
URL
,则意味着您返回了它的一个实例,但您的函数没有返回,它将返回类,这就是为什么它是
类型的URL
public static getGlobalUrl(): typeof URL {
    return window.URL || (<any>window).webkitURL;
}
export interface BrowserURL extends URL {
    createObjectURL(file: File | Blob | MediaSource)
}

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