重载未定义值的打字稿接口

时间:2021-02-15 11:53:15

标签: typescript interface

我正在尝试创建一个具有以下语义的转换器接口:

  1. 输入值可能未定义。
  2. 如果未传递默认值,则结果可能未定义。
  3. 如果传递了定义的默认值,则保证结果不会是未定义的。

并在编译时通过类型检查强制执行此操作。

要添加另一层,我需要包装的底层转换器函数有时会带参数,因此我需要某种包装器来创建它们。

我可以用一个具体的类来实现我所需要的:

// 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;
}

但我认为如果我能让基本的类型化界面工作,那应该很容易。

其他类似的问题,但我找不到解决此问题的方法:

0 个答案:

没有答案