如果隐藏了TypeScript中的全局对象,如何访问?

时间:2018-07-25 07:29:16

标签: typescript window global typing

假设我们具有以下TypeScript代码:

<script>
        function subst() {
            var vars = {};
            var x = document.location.search.substring(1).split('&');
            for (var i in x) { var z = x[i].split('=', 2); vars[z[0]] = unescape(z[1]); }
            var x = ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection'];
            for (var i in x) {
                var y = document.getElementsByClassName(x[i]);
                for (var j = 0; j < y.length; ++j) y[j].textContent = vars[x[i]];

                if (vars['page'] == 1) { 

                    var elt = document.getElementById("tableHeader");
                    elt.parentNode.removeChild(elt);

                    //var e = document.getElementsByTagName('html')[0];
                    //e.parentNode(document.body); 
                }
            }
        }
    </script>

这导致namespace Utils.Date { export fromInternal = (dateString: string): Date => { const year = parseInt(dateString.substr(0, 4), 10); const month = parseInt(dateString.substr(4, 2), 10) - 1; const day = parseInt(dateString.substr(6, 2), 10); return new Date(year, month, day); // error TS2351 } } ,因为命名空间error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature现在隐藏了内置的Date构造函数。

我知道我可以使用Utils.Date访问浏览器中的Date构造函数,但是当我尝试在TypeScript中执行此操作时,我得到了window.Date。相反,我不得不使用类似error TS2339: Property 'Date' does not exist on type 'Window'的东西,但是那样我会失去类型安全性。

有没有一种方法可以访问Date构造函数而不更改名称空间,并且仍然是类型安全的?还是隐藏全局对象仅仅是不好的做法?即使那样,我还是想知道是否有办法。

1 个答案:

答案 0 :(得分:1)

我的首选解决方案是避免名称冲突,尤其是在您的代码与隐藏名称如此紧密相关的情况下。名称冲突最终将影响您添加到Utils名称空间中的更多更多东西。

namespace Utils.DateParsers {

但是如果您决定保留名称冲突,则可以将Date对象填充到中间变量中。

const outerDate = Date;

namespace Utils.Date {
    const fromInternal = (dateString: string): Date => {
        const year = parseInt(dateString.substr(0, 4), 10);
        const month = parseInt(dateString.substr(4, 2), 10) - 1;
        const day = parseInt(dateString.substr(6, 2), 10);

        return new outerDate(year, month, day); // error TS2351
    }
}