【问题标题】:Unable to extend typings of sinon无法扩展 sinon 的类型
【发布时间】:2017-02-20 14:54:39
【问题描述】:

我无法让 sinon-stub-promise 使用 typescript。 @types/sinon-stub-promise 中的定义文件缺少默认导出。我密切关注docs on declaration merging,但它没有编译。

编译错误:

index.ts(4,18): error TS2345: Argument of type 'typeof 'sinon'' is not assignable to parameter of type 'SinonSandbox'.                                            
  Property 'clock' is missing in type 'typeof 'sinon''.                                                                                                           
index.ts(6,25): error TS2339: Property 'stub' does not exist on type 'typeof 'sinon''. 

诗乃的定义文件:

declare namespace Sinon {
  // ...

  interface SinonStubStatic {
    (): SinonStub;
    (obj: any): SinonStub;
    (obj: any, method: string): SinonStub;
    (obj: any, method: string, func: any): SinonStub;
  }

  // ...

  interface SinonFakeTimers {
    now: number;
    create(now: number): SinonFakeTimers;
    setTimeout(callback: (...args: any[]) => void, timeout: number, ...args: any[]): number;
    // ...
  }

  interface SinonSandbox {
    clock: SinonFakeTimers;
    // ...
    stub: SinonStubStatic;
    // ...
  }
}

调整sinon-stub-promise 打字:

// Generated by typings
// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/7de6c3dd94feaeb21f20054b9f30d5dabc5efabd/sinon-stub-promise/sinon-stub-promise.d.ts
/// <reference path="../../../node_modules/@types/sinon/index.d.ts" />
declare module 'sinon' {
  interface SinonPromise {
    resolves(value?: any): void;
    rejects(value?: any): void;
  }

  interface SinonStub {
    returnsPromise(): SinonPromise;
  }
}

// Added by me, because this is missing in the typings on dt
declare module 'sinon-stub-promise' {
  function setup(sinon: Sinon.SinonSandbox): void;
  export = setup;
}

index.ts

import * as sinon from 'sinon';
import sinonStubPromise = require('sinon-stub-promise');

sinonStubPromise(sinon);

最小样本回购:https://github.com/marvinhagemeister/typings-bug

【问题讨论】:

    标签: typescript sinon typescript-typings


    【解决方案1】:

    问题是sinon 的输入在顶层有export,在@types/sinon/index.d.ts 文件的最后:

    declare var Sinon: Sinon.SinonStatic;
    
    export = Sinon;
    

    这似乎使得使用环境模块无法扩展。

    但如果你也将所有模块都设为外部也是可行的,但是我不知道如何使它与类型一起工作(另一方面,将其分发为 @types 似乎是可能的)。

    把它放在你的index.d.ts 旁边的sinon.d.ts 文件中(这是你声明外部sinon 模块扩展的方式——所有接口都将被合并):

    import "sinon";
    declare module "sinon" {
    
        export interface SinonPromise {
            resolves(value?: any): void;
            rejects(value?: any): void;
        }
    
        export interface SinonStub {
            returnsPromise(): SinonPromise;
        }
    
        // had to add these from SinonSandbox to SinonStatic
        // 
        // no idea if it's really supposed to have those methods
        export interface SinonStatic {
            requests: SinonFakeXMLHttpRequest;
            server: SinonFakeServer;
            useFakeServer(): SinonFakeServer;
            restore(): void;
        }
    }
    

    把它放在你的index.ts旁边的sinon-stub-promise.d.ts文件中:

    import * as sinon from 'sinon';
    
    declare function setup(sinon: sinon.SinonSandbox): void;
    
    export = setup;
    

    然后,在你的index.ts

    // in order to use your extension you have to import both here
    import * as sinon from "sinon";
    import "./sinon";
    
    
    import sinonStubPromise = require("./sinon-stub-promise");
    
    sinonStubPromise(sinon);
    
    const mkdirStub = sinon.stub()
      .returnsPromise().resolves(null);
    

    生成的 javascript 代码看起来不错:

    "use strict";
    var sinon = require("sinon");
    var sinonStubPromise = require("sinon-stub-promise");
    sinonStubPromise(sinon);
    var mkdirStub = sinon.stub()
        .returnsPromise().resolves(null);
    

    【讨论】:

    • 感谢您迄今为止的帮助。不幸的是,我仍然遇到同样的错误:index.ts(6,35): error TS2307: Cannot find module 'sinon-stub-promise'.
    • 这里是编译没有错误的示例 repo github.com/fictitious/typings-bug
    • 厉害,不知道可以直接导入*.d.ts文件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多