【问题标题】:Replace method in static class替换静态类中的方法
【发布时间】:2019-06-27 03:36:30
【问题描述】:

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

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

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

【问题讨论】:

  • 您的 sn-ps 似乎有误。在第一个 StringOrNullHandler.getStrings 中根本没有定义。在您的第二个 sn-p 中,_StringOrNullHandler.getString 方法被错误地标记为静态。
  • 此外,您的StringOrNullHandler 对象的实例化方式与StringHandler 相同。它只是一个错字还是您的实际代码以及它不起作用的原因?

标签: typescript class ecmascript-6


【解决方案1】:

最简单的解决方案是将功能移动到一个通用的通用抽象基类,其中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)[]

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2023-03-09
    • 2021-12-08
    • 2020-02-10
    • 2011-01-17
    • 2012-10-11
    • 2023-03-13
    • 2011-07-11
    • 2022-07-22
    相关资源
    最近更新 更多