引擎版本:Cocos Creator 2.0.0
开发语言:Typescript
问题:官方给出的creator.d.ts中有一些没有暴露的接口,但是在项目中还是很有必要用到,看它爆红又不爽。本文以cc.loader.md5Pipe为例,给出一个解决方法。
cc.loader在官方的声明文件中是有定义的,但是里面缺失了几个方法以及对象(在ts中应该为静态属性)。如果是缺失一整个类,那还是十分好解决的,以微信小游戏的wxDownloader为例:
// 相当于js中的window.WXDownloader = function () {}
declare interface WXDownloader {
id: string;
async: boolean;
pipeline: any;
REMOTE_SERVER_ROOT: string;
SUBCONTEXT_ROOT: string;
handle: (item: string, callback: Function) => void;
cleanOldAssets: () => void;
cleanAllAssets: () => void;
}
// 相当于js中的window.wxDownloader = new WXDownloader();
declare var wxDownloader: WXDownloader;
但是假如是类中缺失动态属性与方法,那么可以使用interface来补充类中定义,以下是typescript handbook 中的例子:
class Foo {
x: number;
}
// ... elsewhere ...
interface Foo {
y: number;
}
let a: Foo = ...;
console.log(a.x + a.y); // OK
但是上面的这种情况只能为类添加对象属性或方法,无法直接以类名调用。不巧的是,cc.loader是一个全局的静态类(js中是一个global对象)。为类添加静态方法并不能直接重新声明这个类,而是需要向interface中添加“静态”属性:
declare module cc {
export namespace loader {
//相当于向类中添加了 static md5Pipe : {}
var md5Pipe: {
handle: (item: any) => any,
transformURL: (url: string, hasPatchInFolder?: boolean) => string;
}
}
}
上面这个是比较规范的解决办法,当然还有一个万能的神奇技巧,不过对于强迫症或者代码清洁工来说还是算了:
// 直接在使用的地方
cc.loader['md5Pipe'].transformURL(url);