我正在寻找一种特定的功能。
下面我有一个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]
方法仍然认为返回类型只能是字符串,不能为空。
是否有一种更可组合的方式来获得此功能?
答案 0 :(得分:0)
最简单的解决方案是将功能转移到一个通用的通用抽象基类,其中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)[]