add mixin函数的Typescript定义

时间:2016-10-06 21:12:48

标签: javascript typescript

有没有办法为下面的混合帮助器编写一个Typescript定义?

我在library.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 个答案:

答案 0 :(得分:2)

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

为了实现这个目的,必须以某种方式声明addMixin参数以允许赋值给example属性 - 再次,交集类型,但这次使用可选的example属性可以做到这一点。

然后,你必须使用类型转换为addMixin返回值 - 有一种type guard可以表示它总是有一个example属性会很高兴在赋值之后,但是类型转换现在会执行它。 (我假设你想从中返回instance,你问题中的return example会给出关于未定义example}的错误。

因此,打字稿中的addMixin实现看起来像

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();