在TypeScript中使用不同的param类型覆盖函数的正确方法

时间:2016-04-15 16:01:16

标签: javascript typescript

TL; DR;我的formatAPI函数非常 TYPEScript覆盖函数的方式......

我有一个可以在JavaScript中使用以下四种方式之一的函数:

jsf.format("format", function(){ return ... }); // string, function

jsf.format("format"); // string

jsf.format({
  "format1": function(){ return ... },
  "format2": function(){ return ... }
}); // map[string:function]

jsf.format(); // no params

每个签名在下面执行不同的逻辑。我已经得到了以下内容:

function formatAPI(name: string, callback?: Function): any {
  if (callback) {
    registry.register(name, callback);
  } else if (typeof name === 'object') {
    registry.registerMany(name);
  } else if (name) {
    return registry.get(name);
  } else {
    return registry.list();
  }
}

但它不一致 - 例如第二个参数是string。当我将其更改为string|Object而不是我的逻辑失败时(registry.register(name, callback); - name此处必须是字符串且string|Object不能分配给字符串)。我正在尝试找到一个清晰且可扩展的解决方案(如果我需要,可以在将来添加更多变体),我尝试调整another question但我失败了。

我很感激帮助和/或建议如何为此功能和功能体声明所有可能的签名。

1 个答案:

答案 0 :(得分:3)

切片!它骰子!它吐司!

string

有一点需要注意的是,编译器并没有使用签名来推断类型保护的行为。这意味着您应该稍微保守地构建代码 - 在这里,我将两个typeof个案都放在<input type="text" name="feature[]['<?php echo $row['idlang']?>']" > <input type="text" name="val[]"> 检查中。