错误TS2497:模块“...”解析为一个非模块实体,不能使用此构造

错误TS2497:模块“...”解析为一个非模块实体,不能使用此构造

问题描述:

鉴于这一声明文件promise-retry/index.d.ts,它遵循打字稿的官方module-function.d.ts格式导入:错误TS2497:模块“...”解析为一个非模块实体,不能使用此构造

编辑:粘贴错误的代码段用于此之前(这仍然低于可见)

export = promiseRetry; 

declare function promiseRetry(options: Partial<PromiseRetry.NodeRetryOptions>, fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>): Promise<any>; 
declare function promiseRetry(fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>, options ?: Partial<PromiseRetry.NodeRetryOptions>): Promise<any>; 

declare namespace PromiseRetry { 
    export interface NodeRetryOptions { 
     forever: boolean; 
     unref: boolean; 
     retries: number; 
     factor: number; 
     minTimeout: number; 
     maxTimeout: number; 
     randomize: number | false; 
    } 

    export type RetryFn = (err: any) => never; 
} 

我发现我无法通过此语法导入NodeRetryOptions也不RetryFn

import {NodeRetryOptions, RetryFn} from "promise-retry"; 

let options: NodeRetryOptions = { forever: false }; 
let retryFn: RetryFn = (err:any)=>{throw "Nobody responds on *"}; 

...因为它会引发编译错误:error TS2497: Module '"promise-retry"' resolves to a non-module entity and cannot be imported using this construct.

我也试过另一种语法:

declare module "promise-retry" { 
    export = promiseRetry; 

    function promiseRetry(options: Partial<PromiseRetry.NodeRetryOptions>, fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>): Promise<any>; 
    function promiseRetry(fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>, options ?: Partial<PromiseRetry.NodeRetryOptions>): Promise<any>; 

    namespace PromiseRetry { 
     export interface NodeRetryOptions { 
      forever: boolean; 
      unref: boolean; 
      retries: number; 
      factor: number; 
      minTimeout: number; 
      maxTimeout: number; 
      randomize: number | false; 
     } 

     export type RetryFn = (err: any) => never; 
    } 
} 

但进口(在不同的风格)失败过:

import * as PromiseRetry from "promise-retry"; 

let options: PromiseRetry.NodeRetryOptions = { forever: false }; 
let retryFn: PromiseRetry.RetryFn = (err:any)=>{throw "Nobody responds on *"}; 

...抛出非常相同的编译器错误。

我已经阅读了所有我能找到的东西(包括相关链接),但我无法正常工作。用特朗普的话来说,“没有人知道TypeScript的进口可能如此复杂。”

example you linked to有一个重要的注意事项在其评论:

/*~ Note that ES6 modules cannot directly export callable functions. 
*~ This file should be imported using the CommonJS-style: 
*~ import x = require('someLibrary'); 
*~ 
*~ Refer to the documentation to understand common 
*~ workarounds for this limitation of ES6 modules. 
*/ 

你可能想要的是以下几点:

export = PromiseRetry; 

declare function PromiseRetry(options: Partial<PromiseRetry.NodeRetryOptions>, fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>): Promise<any>; 
declare function PromiseRetry(fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>, options ?: Partial<PromiseRetry.NodeRetryOptions>): Promise<any>; 

declare namespace PromiseRetry { 
    export interface NodeRetryOptions { 
     forever: boolean; 
     unref?: boolean; 
     retries?: number; 
     factor?: number; 
     minTimeout?: number; // milliseconds 
     maxTimeout?: number; // milliseconds|(Number.)Infinity, which is itself of number type. 
     randomize?: number | false; 
    } 

    export type RetryFn = (err: any) => never; 
} 

注意大写PromiseRetry功能相匹配的命名空间。然后,导入,使用以下行:

import PromiseRetry = require('promise-retry'); 

用法必须由命名空间前缀为这样:

let options: PromiseRetry.NodeRetryOptions = { forever: false }; 
let retryFn: PromiseRetry.RetryFn = (err:any) => {throw "Sometimes people respond on *"}; 

作为一个侧面说明,似乎大多数包靠在反对使用名称空间将类型附加为函数声明的名称空间子项。另一个可以让你为函数和命名空间使用不同名称的替代方案如下:

export declare function promiseRetry(options: Partial<PromiseRetry.NodeRetryOptions>, fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>): Promise<any>; 
export declare function promiseRetry(fn: (retry: PromiseRetry.RetryFn, attempt: number) => Promise<any>, options ?: Partial<PromiseRetry.NodeRetryOptions>): Promise<any>; 

declare namespace PromiseRetry { 
    export interface NodeRetryOptions { 
     forever: boolean; 
     unref?: boolean; 
     retries?: number; 
     factor?: number; 
     minTimeout?: number; // milliseconds 
     maxTimeout?: number; // milliseconds|(Number.)Infinity, which is itself of number type. 
     randomize?: number | false; 
    } 

    export type RetryFn = (err: any) => never; 
} 
+0

感谢您的详细回复。你的第一个选择是用'PromiseRetry = require(“promise-retry”);',用于'PromiseRetry()'调用,但是抛出*“找不到名字空间'PromiseRetry'”*用于使用'PromiseRetry。 NodeRetryOptions'。第二个选项适用于'promiseRetry()'调用,但是会再次引发相同的错误。在声明命名空间PromiseRetry之前添加'export'对此错误没有影响。你觉得我应该怎么做? –