簡體   English   中英

如何在 Typescript 中實現具有不同類型參數的泛型方法重載?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM