TypeScript无效的重载签名-与实现不兼容

TypeScript invalid overload signatures - incompatible with implementation

本文关键字:实现 不兼容 无效 重载 TypeScript      更新时间:2023-09-26

我一直收到以下错误:

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;

我看不出上面的函数类型重载有什么问题。我试图一个接一个地删除函数签名(以及根据类型),但我失败了——我实现了一个空函数。

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

这个问题与这个问题有关。

这一切对我来说在打字游戏中都没有错误:

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;