重新定义窗口.控制台与打字脚本



我在我的错误日志代码中有以下javascript,它为某些浏览器定义了console.log,但它不存在(IE没有/没有定义它,除非调试工具打开)。

if (typeof console == "undefined")
{
    window.console = { log: function (msg) { } };
}

尝试将js升级到Typescript时的问题是window.console被定义为Console接口类型,并且由于我没有指定所有内容(显然)不编译。

interface Console {
    info(message?: any, ...optionalParams: any[]): void;
    profile(reportName?: string): void;
    assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
    msIsIndependentlyComposed(element: Element): boolean;
    clear(): void;
    dir(value?: any, ...optionalParams: any[]): void;
    warn(message?: any, ...optionalParams: any[]): void;
    error(message?: any, ...optionalParams: any[]): void;
    log(message?: any, ...optionalParams: any[]): void;
    profileEnd(): void;
}

怎么能告诉它忽略这个接口,只让我重新定义window.console

My best effort guess doesn't work

window.console = { log: function (msg) { } } : any;

更短的解决方案是使用类型断言:

window.console = <any>{ log: function (msg) { } };

甚至使用lambda:

window.console = <any>{ log: () => { } };

该接口将强制您创建所有函数。如果你试图覆盖接口,它会给你一个Duplicate Identifier错误。所以,这里是完整的存根,以节省您的时间:)

window.console =
{
    info: (message?: any, ...optionalParams: any[]) =>
    {
        // ...
    },
    profile: (reportName?: string) =>
    {
        // ...
    },
    assert: (test?: boolean, message?: string, ...optionalParams: any[]) =>
    {
        // ...
    },
    msIsIndependentlyComposed: (element: Element) =>
    {
         return false;
    },
    clear: () =>
    {
        // ...
    },
    dir: (value?: any, ...optionalParams: any[]) =>
    {
        // ...
    },
    warn: (message?: any, ...optionalParams: any[]) =>
    {
        // ...
    },
    error: (message?: any, ...optionalParams: any[]) =>
    {
        // ...
    },
    log: (message?: any, ...optionalParams: any[]) =>
    {
        // ...
    },
    profileEnd: () => 
    {
        // ...
    },
    count: (countTitle?: string) => 
    {
        // ...
    },
    groupEnd: () => 
    {
        // ...
    },
    time: (timerName?: string) => 
    {
        // ...
    },
    timeEnd: (timerName?: string) =>
    {
        // ...
    },
    trace: () => 
    {
        // ...
    },
    group: (groupTitle?: string) => 
    {
        // ...
    },
    dirxml: (value: any) => 
    {
        // ...
    },
    debug: (message?: string, ...optionalParams: any[]) => 
    {
        // ...
    },
    groupCollapsed: (groupTitle?: string) => 
    {
        // ...
    },
    select: (element: Element) => 
    {
        // ...
    },
};

替代解决方案

如果你不想写出所有的方法,你可以这样欺骗TypeScript。

var x: any = 
{
    log: (msg) =>
    {
        //...
    }
};
window.console = <Console>x;

我想我可以这样做:-/

 var w:any = window;
 w.console = { log: function (msg) { } };

最新更新