假设我们具有以下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构造函数而不更改名称空间,并且仍然是类型安全的?还是隐藏全局对象仅仅是不好的做法?即使那样,我还是想知道是否有办法。
答案 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
}
}