![](/img/trans.png)
[英]Typescript Method overloading for different type of parameters but same response
[英]How to implement generic method overloading with different type parameters in Typescript?
对于库函数,我需要使用具有不同类型参数的方法重载,但我不知道如何实现。 我的尝试可能使用了错误的实现签名:
namespace java {
export namespace lang {
export class Object {}
export interface Comparable<T> {
compareTo: (other: T) => boolean;
}
}
export namespace util {
export interface Collection<T> {
[Symbol.iterator](): IterableIterator<T>;
}
export interface Comparator<T> {
compare: (a: T, b: T) => number;
}
}
}
class Collections {
public static max<T1 extends java.lang.Object & java.lang.Comparable<T1>>(
coll: java.util.Collection<T1>): T1 | null;
public static max<T2>(coll: java.util.Collection<T2>, comp: java.util.Comparator<T2>): T2 | null;
public static max<T>(coll: java.util.Collection<T>, comp?: java.util.Comparator<T>): T | null {
let result: T | null = null;
for (const current of coll) {
if (result === null) {
result = current;
continue;
}
const comparison = comp ? comp.compare(result, current) : result?.compareTo(current);
if (comparison < 0) {
result = current;
}
}
return result;
}
}
这也是一个游乐场示例。 在这种情况下正确的做法是什么?
这是一个可能的解决方案,当我停止尝试使用两种类型参数的替代方案时发现的:
public static max<T1 extends java.lang.Object & java.lang.Comparable<T1>>(
coll: java.util.Collection<T1>): T1 | null;
public static max<T2>(coll: java.util.Collection<T2>, comp: java.util.Comparator<T2>): T2 | null;
public static max<T1 extends java.lang.Object & java.lang.Comparable<T1>, T2>(
coll: java.util.Collection<T1> | java.util.Collection<T2>, comp?: java.util.Comparator<T2>): T1 | T2 | null {
if (comp) {
let result: T2 | null = null;
for (const current of coll as java.util.Collection<T2>) {
if (result === null) {
result = current;
continue;
}
const comparison = comp.compare(result, current);
if (comparison < 0) {
result = current;
}
}
return result;
} else {
let result: T1 | null = null;
for (const current of coll as java.util.Collection<T1>) {
if (result === null) {
result = current;
continue;
}
const comparison = result.compareTo(current);
if (comparison < 0) {
result = current;
}
}
return result;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.