2017-03-15 10 views
3

私は、次のしているtypescriptですコード:抑制活字体の警告

private addBrowserNameAsCssClassToHtmlTag(): void { 
    var rootElement = angular.element(document.querySelector("html")); 
    if (this.isOpera()) { 
    rootElement.addClass("opera-browser"); 
    } else if (this.isFirefox()) { 
    rootElement.addClass("firefox-browser"); 
    } else if (this.isSafari()) { 
    rootElement.addClass("safari-browser"); 
    } else if (this.isIE()) { 
    rootElement.addClass("ie-browser"); 
    } else if (this.isChrome()) { 
    rootElement.addClass("chrome-browser"); 
    } 
} 

private isOpera(): boolean { 
    return (!!(<any>window).opr && !!(<any>opr).addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; 
} 

private isFirefox(): boolean { 
    //noinspection TypeScriptUnresolvedVariable 
    return typeof InstallTrigger !== 'undefined'; 
} 

private isSafari(): boolean { 
    return /constructor/i.test(window.HTMLElement) || ((p): boolean => { 
     return p.toString() === "[object SafariRemoteNotification]"; 
    })(!window['safari'] || safari.pushNotification); 
} 

private isIE(): boolean { 
    return /*@[email protected]*/false || !!window.document.documentMode; 
} 

private isChrome(): boolean { 
    return !!window.chrome && !!window.chrome.webstore; 
} 

コードが正常に動作しますが、問題は、それが時間のコンパイルエラーを発生させることである:

error TS2304: Cannot find name 'opr'. 
error TS2339: Property 'opera' does not exist on type 'Window'. 
error TS2304: Cannot find name 'InstallTrigger'. 
error TS2339: Property 'HTMLElement' does not exist on type 'Window'. 
error TS2304: Cannot find name 'safari'. 
error TS2339: Property 'documentMode' does not exist on type 'Document'. 
error TS2339: Property 'chrome' does not exist on type 'Window'. 
error TS2339: Property 'chrome' does not exist on type 'Window'. 

私は無地に書いた場合はjavascriptの私ではありません何か問題があります。このコード部分に関するコンパイラの警告を抑制するにはどうすればよいですか?それとも私が知りません良い解決策がありますか?

答えて

1

迅速かつ汚い答え、使用ブラケット表記、彼らはTS

window["opera"] 

で別のオプションをチェックするタイプではありませんあなたはtypescriptですコンパイラは「ベース」.Dを含んを構築する際に、グローバルなインタフェースを拡張することです。 tsファイルであり、lib.d.tsであるか、またはes6のlib.es6.d.tsを対象とする場合です。グローバルインターフェイスを拡張するには、新しい.d.tsファイルを作成します。たとえばmyGlobalExtentions.d.tsを作成し、ビルドに組み込みます。

interface Window { 
    opera:string; 
} 

interface Document { 
    documentMode:string; 
} 
+0

はIMOそれはWindow'または '' Document'の定義を変更するのは良い考えではありません。これらの余分なメンバーはここでは使用されません。ブラウザがどれであるかを判断するためにチェックされます。大括弧表記の汚れたトリックは、ここでより適合しています。 – Paleo

+0

私は大括弧表記のオプション1がここでは最高だということに同意します。利用可能な2つのオプションを実証したかっただけです。 –

4

ソリューション:

declare const InstallTrigger: any; 

class Abc { 
    private addBrowserNameAsCssClassToHtmlTag(): void { 
     var rootElement = angular.element(document.querySelector("html")); 
     if (this.isOpera()) { 
      rootElement.addClass("opera-browser"); 
     } else if (this.isFirefox()) { 
      rootElement.addClass("firefox-browser"); 
     } else if (this.isSafari()) { 
      rootElement.addClass("safari-browser"); 
     } else if (this.isIE()) { 
      rootElement.addClass("ie-browser"); 
     } else if (this.isChrome()) { 
      rootElement.addClass("chrome-browser"); 
     } 
    } 

    private isOpera(): boolean { 
     return (!!window['opr'] && !!window['opr'].addons) || !!window['opera'] || navigator.userAgent.indexOf(' OPR/') >= 0; 
    } 

    private isFirefox(): boolean { 
     //noinspection TypeScriptUnresolvedVariable 
     return typeof InstallTrigger !== 'undefined'; 
    } 

    private isSafari(): boolean { 
     return /constructor/i.test(window['HTMLElement']) || ((p): boolean => { 
      return p.toString() === "[object SafariRemoteNotification]"; 
     })(!window['safari'] || window['safari'].pushNotification); 
    } 

    private isIE(): boolean { 
     return /*@[email protected]*/false || !!window.document['documentMode']; 
    } 

    private isChrome(): boolean { 
     return !!window['chrome'] && !!window['chrome'].webstore; 
    } 
} 
関連する問題