代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

替换静态类中的方法

  •  0
  • ThomasReggi  · 技术社区  · 7 年前

    我正在寻找一种特定的功能。

    下面我有一个 StringHandler 甲级 StringOrNullHandler 上课。两者都有静态方法。

    export class StringHandler {
        static getString (s): string {
            if (s === 'red') throw new Error;
            return s; 
        }
        static getStrings (s: string[]) : string[] {
            return s.map(StringHandler.getString);
        }
    }
    
    export class StringOrNullHandler {
        static getString (s): string | null {
            if (s === 'red') return null;
            return s; 
        }
    }
    

    StringOrNullHandler.getString 方法和改变 StringOrNullHandler.getStrings 方法将执行。

    StringHandler.getStrings(['red']) // throws
    StringOrNullHandler.getStrings(['red']) // return [null]
    

    我可以在他们不使用的地方做这样的事 static 方法,我可以扩展类。

    export class _StringHandler {
        getString (s): string {
            if (s === 'red') throw new Error;
            return s; 
        }
        getStrings (s: string[]) : string[] {
            return s.map(this.getString);
        }
    }
    
    export const StringHandler = new _StringHandler();
    
    export class _StringOrNullHandler extends _StringHandler{
        getString (s): string | null {
            if (s === 'red') return null;
            return s; 
        }
    }
    
    export const StringOrNullHandler = new _StringHandler();
    
    StringHandler.getStrings(['red']) // throws
    StringOrNullHandler.getStrings(['red']) // return [null]
    

    但现在我有一个不同的问题 StringOrNullHandler.getStrings 方法仍然认为返回类型只能是字符串,不能为空。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Titian Cernicova-Dragomir    7 年前

    最简单的解决方案是将功能移到一个通用抽象基类中,其中 getString T . 那么 _StringHandler _StringOrNullHandler 可以实现它们返回的版本 string string | null

    abstract class _StringHandlerBase<T> {
        abstract getString(s: string) : T;
        getStrings (s: string[]) : T[] {
            return s.map(this.getString);
        }
    }
    export class _StringHandler extends _StringHandlerBase<string> {
        getString (s: string): string {
            if (s === 'red') throw new Error;
            return s; 
        }
    }
    
    export const StringHandler = new _StringHandler();
    
    export class _StringOrNullHandler extends _StringHandlerBase<string | null>{
        getString (s: string): string | null {
            if (s === 'red') return null;
            return s; 
        }
    }
    
    export const StringOrNullHandler = new _StringOrNullHandler();
    
    StringHandler.getStrings(['red']) // typed as string[]
    StringOrNullHandler.getStrings(['red']) // return (string | null)[]
    
    推荐文章