在新的.d.ts文件中添加creator.d.ts中没有的声明

引擎版本: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);

最后贴一下参考:TypeScript Handbook--如何书写声明文件--深入

你可能感兴趣的:(在新的.d.ts文件中添加creator.d.ts中没有的声明)