Typescript 错误TS2497:模块'';解析为非模块实体,无法使用此构造导入

Typescript 错误TS2497:模块'';解析为非模块实体,无法使用此构造导入,typescript,types,typescript-typings,definitelytyped,Typescript,Types,Typescript Typings,Definitelytyped,给定此声明文件promise retry/index.d.ts,该文件遵循TypeScript的官方格式: 编辑:先前为此粘贴了错误的代码段(下面仍然可见): 。。。当它抛出编译错误时:error TS2497:Module“promise retry”解析为非模块实体,无法使用此构造导入。 我还尝试了另一种语法: declare module "promise-retry" { export = promiseRetry; function promiseRetry(opti

给定此声明文件
promise retry/index.d.ts
,该文件遵循TypeScript的官方格式:

编辑:先前为此粘贴了错误的代码段(下面仍然可见):

。。。当它抛出编译错误时:
error TS2497:Module“promise retry”解析为非模块实体,无法使用此构造导入。

我还尝试了另一种语法:

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;
    }
}
。。。抛出完全相同的编译器错误

我已经阅读了所有我能找到的东西(包括这里的相关链接),但我无法让它工作。用特朗普的话说,“没人知道TypeScript导入会如此复杂。”

在评论中有一个重要的提示:

/*~ 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;
}
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;
}
然后,必须使用名称空间作为前缀:

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

作为旁注,似乎大多数包都倾向于使用名称空间来附加类型作为函数声明的名称空间子级。另一种允许您为函数和命名空间使用不同名称的方法是:

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;
}
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;
}
export declare function promiserery(选项:Partial,fn:(重试:promiserery.RetryFn,尝试:number)=>Promise):Promise;
导出声明函数promiserery(fn:(重试:promiserery.RetryFn,尝试:number)=>Promise,options?:Partial):Promise;
声明命名空间Promisery{
导出接口节点重试选项{
永远:布尔;
unref?:布尔值;
重试次数:次数;
因子?:数量;
minTimeout?:数字;//毫秒
maxTimeout?:number;//毫秒|(number.)无穷大,它本身是数字类型。
随机化?:数字|假;
}
导出类型RetryFn=(err:any)=>never;
}

感谢您的详细回复。您的第一个选项,建议使用
import promisery=require(“承诺重试”),用于
promisery()
调用,但抛出“找不到命名空间'promisery'”,以使用
promisery.NodeRetryOptions
。第二个选项适用于
promisery()
调用,但再次抛出相同的错误。在
declare namespace promisery
之前添加
export
对该错误没有影响。你觉得我该怎么办?
let options: PromiseRetry.NodeRetryOptions = { forever: false };
let retryFn: PromiseRetry.RetryFn = (err:any) => {throw "Sometimes people respond on StackOverflow"};
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;
}