Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在TypeScript中使用不同参数类型重写函数的正确方法_Javascript_Typescript - Fatal编程技术网

Javascript 在TypeScript中使用不同参数类型重写函数的正确方法

Javascript 在TypeScript中使用不同参数类型重写函数的正确方法,javascript,typescript,Javascript,Typescript,TL;博士下面我的formatAPI函数不是重写函数的TYpeScript方式 我有一个函数,在JavaScript中可以通过以下四种方式调用: jsf.format("format", function(){ return ... }); // string, function jsf.format("format"); // string jsf.format({ "format1": function(){ return ... }, "format2": function()

TL;博士下面我的
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
不能分配给string)。我试图找到一个清晰且可扩展的解决方案(如果将来需要,可以添加更多变体),我尝试适应,但失败了


我将非常感谢您的帮助和/或建议,告诉我如何声明此函数和函数体的所有可能签名。

It slices!它是骰子!它可以烤面包

// Signatures
function formatAPI(): string[];
function formatAPI(name: string): string;
function formatAPI(name: string, callback: (arg: string) => void): void;
function formatAPI(map: { [name: string]: () => string }): void;
// Implementation
function formatAPI(nameOrMap?: string | { [name: string]: () => string }, callback?:(arg: string) => void): string | string[] | void {
  if (typeof nameOrMap === 'string') {
    if (callback) {
      return registry.register(nameOrMap, callback);
    } else {
      return registry.get(nameOrMap);
    }
  } else if (...) {
    // Keep adding checks here
  }
}

需要注意的一点是,编译器不使用签名来推断类型保护的行为。这意味着您的代码结构应该稍微保守一点——在这里,我将两个
string
案例都放在
typeof
检查中。

It slices!它是骰子!它可以烤面包

// Signatures
function formatAPI(): string[];
function formatAPI(name: string): string;
function formatAPI(name: string, callback: (arg: string) => void): void;
function formatAPI(map: { [name: string]: () => string }): void;
// Implementation
function formatAPI(nameOrMap?: string | { [name: string]: () => string }, callback?:(arg: string) => void): string | string[] | void {
  if (typeof nameOrMap === 'string') {
    if (callback) {
      return registry.register(nameOrMap, callback);
    } else {
      return registry.get(nameOrMap);
    }
  } else if (...) {
    // Keep adding checks here
  }
}

需要注意的一点是,编译器不使用签名来推断类型保护的行为。这意味着您的代码结构应该稍微保守一点——在这里,我将两个
string
案例都放在
typeof
检查中。

回答得很好!所以,你们能不能解释一下,若并没有用于类型保护,编译器使用这些签名的目的是什么?PS我可以看到TS编译器大量使用了'if(typeof nameOrMap=='string'){`:)多亏了
typeof
它知道了他所处的类型上下文。签名定义了调用函数的合法性,以及当你使用一组特定的类型调用时返回的内容伟大的答案!那么你能解释一下编译器使用这些签名的目的吗,如果它不用于类型保护?PS我可以看到由于
typeof
编译器大量使用了'if(typeof nameOrMap==='string'){`:),它知道他所处的类型上下文。签名定义了调用函数的合法性,以及使用特定类型集调用时返回的内容