无法导入模块

时间:2017-08-05 22:42:57

标签: typescript import module

我有以下代码:

import {AsyncLock} from 'async-lock';

但是tsc抱怨道:

  

[ts]模块'“my_app / node_modules / @ types / async-lock / index”'没有导出的成员'AsyncLock'。

但如果我查看my_app/node_modules/@types/async-lock/index.d.ts,我会看到以下内容:

interface AsyncLockDoneCallback {
    (err?: Error, ret?: any): void;
}

interface AsyncLockOptions {
    timeout?: number;
    maxPending?: number;
    domainReentrant?: boolean;
    Promise?: any;
}

declare class AsyncLock {
    constructor(options?: AsyncLockOptions);

    acquire(key: string | string[], fn: (done: AsyncLockDoneCallback) 
=> any, cb: AsyncLockDoneCallback, opts?: AsyncLockOptions): void;
    acquire(key: string | string[], fn: (done: AsyncLockDoneCallback) 
=> any, opts?: AsyncLockOptions): PromiseLike<any>;

    isBusy(): boolean;
}

declare namespace AsyncLock { }

export = AsyncLock;

我非常期待AsyncLock在这里导出。我的导入定义在哪里出错?

1 个答案:

答案 0 :(得分:2)

简答

当声明文件导出时如下:

export = AsyncLock;

然后我们用以下两种方式之一导入它:

import AsyncLock = require("async-lock"); // thank you unional
import * as AsyncLock from "async-lock";

两者都支持静态分析。 (参见评论中下面的统一修正案。)

进一步详情

来自TypeScript modules documentation

  

CommonJS和AMD通常都有一个export对象的概念,它包含模块的所有导出。

     

他们还支持使用自定义单个对象替换exports对象。默认导出旨在替代此行为;但是,这两者是不相容的。 TypeScript支持export =来模拟传统的CommonJS和AMD工作流程。

当声明文件导出时,您尝试使用的是更现代的样式:

export { AsyncLock }

在这种情况下,我们会像这样导入它:

import { AsyncLock } from "async-lock";