代码之家  ›  专栏  ›  技术社区  ›  jantimon

add mixin函数的类型脚本定义

  •  0
  • jantimon  · 技术社区  · 9 年前

    我在图书馆里有这个图案。js,我想创建library.d.ts

    // declaration in `library.js`
    var mixin = {
      example: function {}
    }
    
    function addMixin(instance) {
      instance.example = mixin.example;
      return example;
    }
    
    // usage in `client.js`
    class MyClass {}
    let myInstance = addMixin(new MyClass());
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   artem    9 年前

    一种可能的方法是使用泛型类型参数T声明addMixin,并将AddMixinReturnType声明为 intersection type 具有mixin类型的T。

    要使其工作,必须以某种方式声明addMixin参数,以允许将 example 属性-同样,交叉点类型,但这次是可选的 实例

    然后,您必须使用类型转换 addMixin 返回值-如果有某种 type guard 实例 属性,但类型转换目前将执行此操作。(我想你想回来 instance return example 在你的问题中,给出了一个关于未定义的错误 实例 ).

    所以 添加混合素 typescript中的实现可能如下所示:

    var mixin = {
        example: function () { }
    };
    
    function addMixin<T>(instance: T & { example?() }): T & { example() } {
        instance.example = mixin.example;
        return instance as T & { example() };
    }
    

    如果实际实现是在javascript中的,并且您只需要声明文件,那么它可以如下所示

    // declaration in library.d.ts
    declare function addMixin<T>(instance: T & { example?() }): T & { example() };
    
    // implementation in library.js
    var mixin = {
        example: function() {}
    };
    
    function addMixin(instance) {
      instance.example = mixin.example;
      return instance;
    }
    
    
    // can be used in client.ts with library.d.ts
    // tsc client.ts library.d.ts
    
    class MyClass {}
    let myInstance = addMixin(new MyClass());
    
    myInstance.example();