我有以下代码:
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在这里导出。我的导入定义在哪里出错?
答案 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";