Javascript Typescript跨项目共享基元类型上的自定义方法
我正在尝试实现一个二进制搜索树() 对于Javascript Typescript跨项目共享基元类型上的自定义方法,javascript,java,typescript,Javascript,Java,Typescript,我正在尝试实现一个二进制搜索树() 对于insert(data:T)、find(data:T)和remove(data:T)等操作,我在Java中看到了一些具有以下特征的示例: 类BST 除非包含的文件是ES6模块,否则该声明应该有效,在这种情况下,您必须在接口声明周围放置declare global{…}。如果它不起作用,你会得到什么错误 最好的方法可能是让BST的构造函数获取(x:T,y:T)=>number类型的比较器。然后,如果调用方愿意,可以使用带有比较器的基元类型,而不是标准排序 谢
insert(data:T)
、find(data:T)
和remove(data:T)
等操作,我在Java中看到了一些具有以下特征的示例:
类BST
除非包含的文件是ES6模块,否则该声明应该有效,在这种情况下,您必须在接口声明周围放置declare global{…}
。如果它不起作用,你会得到什么错误
最好的方法可能是让BST
的构造函数获取(x:T,y:T)=>number
类型的比较器。然后,如果调用方愿意,可以使用带有比较器的基元类型,而不是标准排序
谢谢你,马特。我没有把“申报全球”。构造函数方法也应该有效。我将尝试这两种方法,并让您知道:)再次感谢!马特:当我在文件中简单地添加声明全局
时,我得到了以下错误:[ts]全局范围的扩展只能直接嵌套在外部模块或环境模块声明中。
。文件名或它的位置到底应该是重要的吗?很抱歉,我认为我写错了,这是有效的:declare interface Number{compareTo(numObj:Number):-1 | 0 | 1;
Aha!在运行时,ts节点
不会预先执行所有文件;它只执行主文件,然后从那里执行require
和import
。因此,假设您的数字扩展名在global.ts
中,您必须使用require(“/global”)
或import./global”;
强制ts节点执行文件(后者即使global.ts
不是ES6模块也有效)您可以编写类似于类BST
的代码,但这种方法并不理想,因为可能很难以生成所需顺序的方式将自定义对象转换为数字。我仍然建议使用自定义比较器方法。
class Person implements Comparable<Person> {
private String name;
private Integer age;
///...
///..
@override
int compareTo(Person otherObj) {
// return 0 | -1 | 1;
}
}
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;