2017-04-12 488 views
1

我正在将Node + ES6项目转换为TypeScript。我瞄准ES6(因为我正在运行Node 7.x)并使用Map。node + TypeScript:无法重新声明块范围变量'events'

运行tsc -p回报:

  • src/actions.ts(3,9): error TS2451: Cannot redeclare block-scoped variable 'events'
  • src/calendar.ts(5,10): error TS2300: Duplicate identifier 'fetchEvents'.
  • src/index.ts(3,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'actions' must be of type 'Map<any, any>', but here has type 'any'.

目前尚不清楚为什么这些重复的标识或正在标记为重新申报,特别是在上下文节点的需求/模块导入。在require语句中使用标准const使得这个问题更加严重。

calendar.ts

const { rp } = require("request-promise") 

var events = <any> {} 

// both are exported via module.exports = { events, fetchEvents } 
function fetchEvents(key: string, url: string, options: object) { 
    ... 

actions.ts

const moment = require("moment") 
var { events, fetchEvents } = require("./calendar") 

var actions = new Map() 

tsconfig.json

{ 
    "compilerOptions": { 
    "target": "es6", 
    "outDir": "./built", 
    "declaration": true, 
    "rootDir": ".", 
    "baseUrl" : "./packages", 
    "experimentalDecorators": true, 
    "moduleResolution": "node", 
    "noImplicitAny": false, 
    "strictNullChecks": true, 
    "noImplicitReturns": true, 
    "noImplicitThis": true 
    }, 
    "include": [ 
    "src/**/*" 
    ], 
    "exclude": [ 
    "dist", 
    "node_modules", 
    ".vscode" 
    ] 
} 

回答

1

不知道var {...建设是有效的。 var使全局范围变量作用域。

如果您在actions.ts使用:

const moment = require("moment") 
import calendar = require("./calendar"); 
// console.log(calendar.events) 

+0

这会起作用,因为TypeScript似乎以不同的方式处理导入/名称空间。我找不到有用的文档,但是使用'module.exports = {events,fetchEvents}',然后导入为'calendar'。 – elithrar