Заменить метод в статическом классе - PullRequest
0 голосов
/ 03 февраля 2019

Я ищу определенный вид функциональности.

Ниже у меня есть класс 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 Ответ

0 голосов
/ 04 февраля 2019

Самое простое решение - переместить функциональность в общий базовый абстрактный базовый класс, где метод 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)[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...