我要寻找一个特定种类的功能。
下面我有一个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
方法仍然认为,返回类型只能是一个字符串,而不是空。
有没有获得此功能更可组合的方式吗?
最简单的解决方案是功能移动到一个共同的通用抽象基类,其中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)[]