Javascript 在TypeScript中使用不同参数类型重写函数的正确方法
TL;博士下面我的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()
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'){`:),它知道他所处的类型上下文。签名定义了调用函数的合法性,以及使用特定类型集调用时返回的内容