打字稿在整个项目中共享关于原始类型的自定义方法

时间:2018-08-31 21:02:47

标签: javascript java typescript

我正在尝试实现二进制搜索树(Github repo)。

对于insert(data: T)find(data: T)remove(data: T)之类的操作,我在Java中看到了一些具有以下签名的示例:

class BST<T extends Comparable<? super T>> { ... }

我相信通过此签名,我们也可以创建由对象组成的BST,作为 Node 。像这样:

class Person implements Comparable<Person> {
  private String name;
  private Integer age;
  ///...
  ///..
  @override
  int compareTo(Person otherObj) {
    // return 0 | -1 | 1;
  }
}

我想通过TypeScript中的泛型实现类似的功能。这是我面临的问题,需要以下方面的帮助/建议:

  1. 与Java不同,JS基本类型没有compareTo方法-因此,我的问题是-如何向基本类型添加方法并在整个项目中共享该定义。创建 namespace 是什么?
interface Number {
  compareTo(o: number): number;
}

Number.prototype.compareTo = function(o: number) {
  // add checks for corner cases
  return this > o ? 1 : this < o ? -1 : o;
}

let a = 2;
let b = 3;
a.compareTo(b); // -1;

我的第一个问题是如何在整个项目中共享这种新的原型方法?

  1. 替代方案?有人可以提出一些替代方案,以某种方式为所有类型的数据构建通用的二进制搜索树。

class BST <T | T extends Comparable<T>> implements Tree<T> {...}

但这给了我编译错误,其中说Comparable is being used as a value when it is only a _type_和其他语法错误。

我的想法是: T 应该是原始类型,或者应该是实现 Comparable<T> 接口的类型。

1 个答案:

答案 0 :(得分:1)

  1. 除非包含文件是ES6模块,否则该声明应该有效,在这种情况下,您必须在接口声明周围放置declare global { ... }。如果不起作用,您会遇到什么错误?
  2. 最好的办法是让BST的构造函数采用(x: T, y: T) => number类型的比较器。然后,如果愿意,调用者可以将原始类型与标准顺序以外的其他比较器一起使用。