静态类中的替换方法

时间:2019-02-02 23:19:25

标签: typescript class ecmascript-6

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

下面我有一个switchMap()类和一个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] 方法仍然认为返回类型只能是字符串,不能为空。

是否有一种更可组合的方式来获得此功能?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是将功能转移到一个通用的通用抽象基类,其中getString方法是抽象的,并返回类型参数T。然后_StringHandler_StringOrNullHandler可以实现分别返回stringstring | 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)[]