声明混合类的类型

时间:2019-01-16 18:09:12

标签: typescript

不是TypeScript用户,但是我正在为我的JavaScript库编写TypeScript声明文件,并且停留在以下代码上:

function ArrayMixin(Base) {
  class ExtendedArray extends Base {}
  return ExtendedArray;
}

这将返回扩展给定类的类。在这种情况下,我想将Base限制为Arrays和TypedArrays(所谓的索引集合)。我可以创建一个声明所有必要构造函数的联合类型,并将其用作函数签名中的类型:

type IndexedCollection = ArrayConstructor|Int8ArrayConstructor
declare function ArrayMixin(Base: IndexedCollection): ExtendedArray

但是如何指定我的ExtendedArray扩展IndexedCollection中的任何扩展?如何声明ExtendedArray?

2 个答案:

答案 0 :(得分:1)

您可以使用generic constraints来指定您的返回类型扩展IndexedCollection,如下所示:

declare function ArrayMixin<T extends IndexedCollection>(Base: IndexedCollection): T

答案 1 :(得分:1)

如SørenD.Ptæus所建议的那样,对泛型进行了更多研究,这使我得出以下结论。 为了声明此JavaScript结构:

function ArrayMixin(Base) {
  class ExtendedArray extends Base {}
  return ExtendedArray;
}

我们在声明文件中需要它:

export declare class ExtendedArray {}

interface Constructor<T> {
    new (...args): T;
}

export declare function ArrayMixin<T extends IndexedCollection>(Base?: Constructor<T>):
 Constructor<T & ExtendedArray>;