我正在尝试创建一个具有以下语义的转换器接口:
并在编译时通过类型检查强制执行此操作。
要添加另一层,我需要包装的底层转换器函数有时会带参数,因此我需要某种包装器来创建它们。
我可以用一个具体的类来实现我所需要的:
// simple example - insert the separator between each digit of a number
const addSeperator = (num: number, sep: string) => String(num).replace(/(.)(?=.)/g, '$&' + sep);
class NumStringConverter {
constructor(private sep: string) {}
convert(val: number): string;
convert(val: number | undefined): string | undefined;
convert(val: number | undefined, dflt: string): string;
convert(val: number | undefined, dflt?: string): string | undefined {
return val !== undefined ? addSeperator(val, this.sep) : dflt;
};
}
const dasherize = new NumStringConverter('-');
let result: string;
result = dasherize.convert(123); // '1-2-3'
result = dasherize.convert(123, 'empty'); // '1-2-3'
result = dasherize.convert(undefined); // desired error - does not compile
result = dasherize.convert(undefined, 'empty'); // 'empty'
但我找不到将其扩展到接口的方法:
interface NumStringConverter {
convert(val: number): string;
convert(val: number | undefined): string | undefined;
convert(val: number | undefined, dflt: string): string;
}
function createNumStringConverter(sep: string): NumStringConverter {
return {
// *** this fails with a long type error ***
convert: (val: number | undefined, dflt?: string): string | undefined => {
return val !== undefined ? addSeperator(val, sep) : dflt;
}
};
}
const dasherize = createNumStringConverter('-');
这可能吗?
我最终需要将其参数化为:
interface Converter<T, U> {
convert(val: T): U;
convert(val: T | undefined): U | undefined;
convert(val: T | undefined, dflt: U): U;
}
但我认为如果我能让基本的类型化界面工作,那应该很容易。
其他类似的问题,但我找不到解决此问题的方法: