在静态类替换法

问题描述 投票:0回答:1

我要寻找一个特定种类的功能。

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

有没有获得此功能更可组合的方式吗?

typescript class ecmascript-6
1个回答
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)[]
© www.soinside.com 2019 - 2024. All rights reserved.