Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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,我不断得到以下错误: error TS2394: Overload signature is not compatible with function implementation. 对于以下代码: import Registry = require('../class/Registry'); type Format = Function; type FormatRegistry = { [s: string]: Format; } var registry = new Regist

我不断得到以下错误:

error TS2394: Overload signature is not compatible with function implementation.
对于以下代码:

import Registry = require('../class/Registry');

type Format = Function;

type FormatRegistry = {
  [s: string]: Format;
}

var registry = new Registry<Format>();

function formatAPI(): FormatRegistry; // get all formats // HERE GOES THE COMPILER ERROR
function formatAPI(name: string): Format; // get format
function formatAPI(name: string, format: Format): void; // register format
function formatAPI(formatMap: FormatRegistry): void; // register many formats
function formatAPI(nameOrMap?: string|FormatRegistry, callback?: Format): FormatRegistry|Format|void {
  if (typeof nameOrMap === 'object') {
    registry.registerMany(nameOrMap);
  } else if (typeof nameOrMap === 'string') {
    if (callback) {
      registry.register(nameOrMap, callback);
    } else {
      return registry.get(nameOrMap);
    }
  } else {
    return registry.list();
  } 
}

export = formatAPI;
import Registry=require('../class/Registry');
类型格式=函数;
类型FormatRegistry={
[s:string]:格式;
}
var registry=new registry();
函数formatAPI():FormatRegistry;//获取所有格式//出现编译器错误
函数formatAPI(名称:字符串):格式;//获取格式
函数formatAPI(名称:字符串,格式:format):void;//寄存器格式
函数formatAPI(formatMap:FormatRegistry):void;//注册多种格式
函数formatAPI(nameOrMap?:字符串| FormatRegistry,回调?:格式):FormatRegistry | Format | void{
if(typeof nameOrMap==='object'){
registry.registerMany(nameOrMap);
}else if(typeof nameOrMap=='string'){
如果(回调){
registry.register(nameOrMap,callback);
}否则{
返回registry.get(nameOrMap);
}
}否则{
返回registry.list();
} 
}
导出=格式化API;
我看不出上面的函数类型重载有什么问题。我试图一块一块地删除函数签名(和相应的类型),但失败了——我得到了一个空函数

代码背后的逻辑很好(所有测试都通过),只是重载在某种程度上是无效的


这个问题与之相关。

这一切对我来说都是正确的:

class Registry<T> {
    registerMany(items: FormatRegistry) { } 
    register(name: string, cb: Format) { }
    get(name: string) { }
    list() { }
}

type Format = Function;

type FormatRegistry = {
  [s: string]: Format;
}

var registry = new Registry<Format>();

function formatAPI(): FormatRegistry; // get all formats // HERE GOES THE COMPILER ERROR
function formatAPI(name: string): Format; // get format
function formatAPI(name: string, format: Format): void; // register format
function formatAPI(formatMap: FormatRegistry): void; // register many formats
function formatAPI(nameOrMap?: string|FormatRegistry, callback?: Format): FormatRegistry|Format|void {
  if (typeof nameOrMap === 'object') {
    registry.registerMany(nameOrMap);
  } else if (typeof nameOrMap === 'string') {
    if (callback) {
      registry.register(nameOrMap, callback);
    } else {
      return registry.get(nameOrMap);
    }
  } else {
    return registry.list();
  } 
}

export = formatAPI;
类注册表{
registerMany(项:FormatRegistry){}
寄存器(名称:字符串,cb:格式){}
获取(名称:string){}
列表(){}
}
类型格式=函数;
类型FormatRegistry={
[s:string]:格式;
}
var registry=new registry();
函数formatAPI():FormatRegistry;//获取所有格式//出现编译器错误
函数formatAPI(名称:字符串):格式;//获取格式
函数formatAPI(名称:字符串,格式:format):void;//寄存器格式
函数formatAPI(formatMap:FormatRegistry):void;//注册多种格式
函数formatAPI(nameOrMap?:字符串| FormatRegistry,回调?:格式):FormatRegistry | Format | void{
if(typeof nameOrMap==='object'){
registry.registerMany(nameOrMap);
}else if(typeof nameOrMap=='string'){
如果(回调){
registry.register(nameOrMap,callback);
}否则{
返回registry.get(nameOrMap);
}
}否则{
返回registry.list();
} 
}
导出=格式化API;

@CoreyAlix那么我应该如何解决这个问题呢?我的代码在typescript游戏中也适用。但是我计算机上的编译器抛出了这个错误…tsc的哪个版本?typescript“1.8.9”我更新到了1.8.10,没有问题。共享您的tsconfig.json。我创建了一个registry.ts,它仍然有效:
export-type-Format=Function;导出类型FormatRegistry={[s:string]:Format;}导出类注册表{registerMany(items:FormatRegistry){}寄存器(name:string,cb:Format){}获取(name:string){}列表(){}