2017-04-19 86 views
2

我打字稿打字稿 - TSC編譯器打破我的代碼

寫了這個代碼
import redis from 'redis'; 
import Promise from 'bluebird'; 

const DEFAULT_REDIS_TTL = 7200; // 2 hours 

export default class Redis { 

    readonly client : any; 
    ttl : number = DEFAULT_REDIS_TTL; 

    constructor(uri? : string, ttl : number = DEFAULT_REDIS_TTL) { 
     this.client = redis.createClient(uri); 
    } 

    ... 
} 

export { Redis }; 

編譯器給了我這個

"use strict"; 
Object.defineProperty(exports, "__esModule", { value: true }); 
var redis_1 = require("redis"); 
var bluebird_1 = require("bluebird"); 
var DEFAULT_REDIS_TTL = 7200; // 2 hours 
var Redis = (function() { 
    function Redis(uri, ttl) { 
     if (ttl === void 0) { ttl = DEFAULT_REDIS_TTL; } 
     this.ttl = DEFAULT_REDIS_TTL; 
     this.client = redis_1.default.createClient(uri); 
     this.client.on('error', function (error) { 
      console.error(error); 
     }); 
... 
exports.Redis = Redis; 
exports.default = Redis 

我不知道爲什麼「redis.createClient(URI); just become redis_1.default.createClient(URI);`

試圖在節點運行我的代碼時,我收到以下錯誤

build/Lib/Cache/Redis.js:11 
     this.client = redis_1.default.createClient(uri); 
            ^

TypeError: Cannot read property 'createClient' of undefined 

tsconfig看起來像這樣

{ 
    "compilerOptions": { 
     "module": "mymodule", 
     "target": "es5", 
     "noImplicitAny": false, 
     "sourceMap": false, 
     "module": "commonjs", 
     "outDir": "build" 
    }, 

    "include": [ 
     "src/**/*.ts" 
    ], 

    "exclude": [ 
     "node_modules" 
    ] 
} 

我運行編譯器在主目錄中

tsc 

我正在使用node 6.7.2

+0

請注意,代碼中的'export default class Redis'如何在輸出中變成'exports.default = Redis'。 'redis'也是如此,它被'導入爲'exports.default = redis',這就是爲什麼它被使用'redis_1.default.createClient'。 'redis_1'是對'exports'的引用,'redis_1.default'是對'exports.default'的引用。你可能遇到的問題只是一個缺失的模塊(你運行'npm i redis'嗎?)。嘗試在你的代碼中使用'console.log(redis)' – jevgenig

+0

使用不同的導入語法可以幫助:'import * as'redis';'和'import *'作爲'bluebird'的Promise;' – artem

+0

我運行'console.log (redis)'和'console.log(redis.createClient)',我得到了redis對象並且輸出如[[Function]'爲第二個控制檯日誌 – user7887107

回答

0

的進口改爲:

import * as redis from 'redis'; 

我不認爲分型爲redis有一個默認的出口。確保你有最新的打字。 如果您有最新的打印,import redis from 'redis';應該會引發編譯時錯誤。

+0

+1 [link] //github.com/types/npm-redis/blob/master/index.d.ts)表示相同。 ''從'redis'導入{createClient};'也可能是一個選項,如果你只是想使用一種方法 – jevgenig

+0

謝謝你這個工作...它取決於模塊,我沒有與'mongodb-driver'問題和'express' – user7887107