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])