【问题标题】:Modify namespace from package从包中修改命名空间
【发布时间】:2017-07-19 16:18:32
【问题描述】:

我正在使用我想修改的通过@types 安装的类型 def。

Q 有一个非常软的.d.ts,它不允许您指定传递给rejectDeferred 的参数类型。 Defferred 的界面如下所示:

declare namespace Q {
    // ...
    export interface Deferred<T> {
        promise: Promise<T>;
        resolve(value?: IWhenable<T>): void;
        reject(reason: any): void;
        notify(value: any): void;
        makeNodeResolver(): (reason: any, value: T) => void;
    }
    // ...
}

对于普通接口,您可以只在global.d.ts 中创建具有匹配名称的接口,它们会自动合并,我无法让它与命名空间中的接口一起使用。

我想做的是在我的 global.d.ts 文件中删除这样的内容:

declare namespace Q {
    export interface Deferred<T, R, N> {
        reject(reason: R): void;
        notify(value: N): void;
    }

    export function defer<T, R, N>(): Deferred<T, R, N>;
}

并让它将该接口和功能合并回Q 中的.d.ts 中的@types 中的那些。通过调用const def = Q.defer&lt;string, string, number() 进行测试,引发Supplied parameters do not match any signature of call target.

【问题讨论】:

    标签: typescript namespaces


    【解决方案1】:

    你可以这样做:

    declare namespace Q {
        export interface Deferred<T, E=any, N=any> {
            promise: Promise<T>;
            resolve(value?: IWhenable<T>): void;
            reject(reason: E): void;
            notify(value: N): void;
            makeNodeResolver(): (reason: any, value: T) => void;
        }
    }
    

    您不能重命名泛型参数T,如果添加任何额外参数,它们需要具有默认值,以便Deferred 的其他用途不需要额外的参数。


    更新 1

    @桑迪吉福德said

    为简洁起见,我省略了对使用DeferredQ 位的修改。我已经编辑了我的问题以包括它们。这似乎仍然不起作用 - 调用 Q.defer&lt;string, string, number&gt;() 仍然会引发异常。

    您仍然必须为添加到defer 函数的任何额外泛型类型提供默认参数。我不确切知道你的项目是如何布局的,但是这样的东西对我有用,带有模块扩充:

    import { Q } from 'q'
    
    declare module 'q' {
      namespace Q {
    
        interface Deferred<T, R=any, N=any> {
          reject(reason: R): void;
          notify(value: N): void;
        }
    
        function defer<T, R=any, N=any>(): Deferred<T, R, N>;
      }
    }
    
    Q.defer<string, string, number>();
    

    【讨论】:

    • 为简洁起见,我省略了对使用DeferredQ 位的修改。我已经编辑了我的问题以包括它们。这似乎仍然不起作用 - 调用 Q.defer&lt;string, string, number&gt;() 仍然会引发异常。
    • Update 1 取得了很大进展!唯一的变化是在moduleinterface/function 之间丢失namespace。不幸的是,modules 似乎没有合并,并且在我的覆盖中未明确提及的所有内容都将被覆盖。我开始认为我应该卸载@type 并使用我自己的.d.ts,或者只是在确定类型上打开一个拉取请求。
    • 我同意:使用您自己的类型声明文件可能是您最干净的解决方案。
    猜你喜欢
    • 2023-04-05
    • 2012-10-10
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2010-11-11
    • 2016-11-05
    相关资源
    最近更新 更多