我需要能够用不同类型重新声明变量名。我正在使用TypeScript转换为es3(服务器端jscript ugh),并且在不同的上下文中,此代码将使用具有不同类型但名称相同的不同全局变量运行。
本质上,我需要能够使用类型声明文件使变量在每个目录中作用域。
{
"compilerOptions": {
"target": "ES3",
"module": "system",
"watch": true,
"outDir": "js",
"sourceMap": false,
"noImplicitAny": false,
"downlevelIteration": true,
"strictNullChecks": true,
"allowJs": true,
"noEmitOnError": false
}
}
我的文件结构是这样的:
- tsconfig.json
/ts
/context
/contextA
- contextA.d.ts - contains "declare var context: typeA;"
- runInContextA.ts - contains reference to a var called 'context'
/contextB
- contextB.d.ts - contains "declare var context: typeB;"
- runInContextB.ts - contains reference to a var called 'context'
- context.d.ts - typings for the context environment beyond context var
/otherStuff
- doesNotUseContextVars.ts - context-free code
/typings
- tsd.t.ts - global typings for rest of system
/js
/context
/contextA
- runInContextA.js - will be imported into jscript system
/contextB
- runIncontextB.js - will be imported into jscript system
/otherStuff
- doesNotUseContextVars.js
在contextA
中,我需要'context'来指代typeA
的类型,而对于contextB
则相反。 contextA
和contextB
都有一些共享的全局变量存储在context.d.ts
中,doesNotUseContextVars.ts
不应使用任何上下文类型。所有ts文件都应使用tsd.t.ts
中的声明。
我的系统具有复杂的类继承结构,主要使用ts进行智能感知,并在需要处理系统时避免了很多“陷阱”。
我一直在尝试使用引用路径,因此在我的'runInContextA.ts'文件的顶部,我将引用contextA.d.ts
/// <reference path="./contextA.d.ts" />
同样,在contextA.d.ts
中,我还会有另一个参考文献:
/// <reference path="../../context.d.ts" />
declare var context: contextA;
对于上下文B,反之亦然,它指的是它自己的链。
但是,当我转到runInContextB.ts
时,上下文var的类型为contextA
,并且收到了cannot re-declare blocked-scope variable 'context'
ts错误消息。我在上下文B的引用中没有对上下文A的引用,所以我不理解。
我不能真正使用名称空间,否则在为我的环境进行编译时必须将它们删除,而且我也不能使用模块。
我需要为每个文件设置全局类型,但仅针对该目录中的ts文件。我不会将它们捆绑在一起,因此“全局”实际上仅表示该文件的全局。