Typescript - компилятор tsc ломает мой код

Я написал этот код в Typescript

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 becomeredis_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


person user7887107    schedule 19.04.2017    source источник
comment
Обратите внимание, как 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) в своем коде   -  person Jevgeni    schedule 19.04.2017
comment
Может помочь использование другого синтаксиса импорта: import * as redis from 'redis'; и import * as Promise from 'bluebird';   -  person artem    schedule 19.04.2017
comment
Я запускаю console.log(redis) и console.log(redis.createClient) и получаю объект redis и вывожу как [Function] для второго consolelog   -  person user7887107    schedule 19.04.2017
comment
я попробую изменить синтаксис импорта   -  person user7887107    schedule 19.04.2017


Ответы (1)


Измените импорт на:

import * as redis from 'redis';

Я не думаю, что типизация для redis имеет экспорт по умолчанию. Убедитесь, что у вас есть последние типизированные данные. Если у вас есть последние типизированные данные, import redis from 'redis'; должна вызвать ошибку времени компиляции.

person Saravana    schedule 19.04.2017
comment
+1, поскольку ссылка предполагает то же самое. import { createClient } from 'redis'; также может быть вариантом, если вы просто хотите использовать один метод - person Jevgeni; 19.04.2017
comment
спасибо, это сработало ... это зависит от модулей, у меня не было проблем с mongodb-driver и express - person user7887107; 19.04.2017