【问题标题】:Typescript - tsc compiler breaks my codeTypescript - tsc 编译器破坏了我的代码
【发布时间】:2017-09-15 01:29:29
【问题描述】:

我用 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

【问题讨论】:

  • 请注意您的代码中的export default class Redis 如何在输出中变成exports.default = Redisredis 也是如此,它被导入为exports.default = redis,这就是它被使用redis_1.default.createClient 的原因。 redis_1 引用 exportsredis_1.default 引用 exports.default。您可能遇到的问题只是缺少一个模块(您是否运行过npm i redis?)。在您的代码中尝试console.log(redis)
  • 使用不同的导入语法可能会有所帮助:import * as redis from 'redis';import * as Promise from 'bluebird';
  • 我运行 console.log(redis)console.log(redis.createClient) 并且我得到了 redis 对象并像 [Function] 一样输出第二个控制台日志
  • 我会尝试更改导入语法

标签: node.js typescript tsc


【解决方案1】:

将您的导入更改为:

import * as redis from 'redis';

我认为redis 的类型没有默认导出。确保你有最新的类型。 如果你有最新的类型,import redis from 'redis'; 应该会抛出一个编译时错误。

【讨论】:

  • +1 as link 建议相同。 import { createClient } from 'redis'; 也可能是一种选择,如果您只想使用一种方法
  • 谢谢你这个工作......这取决于模块,我没有mongodb-driverexpress的问题
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 2017-09-30
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多