TypeScript:重载函数时,“重载签名必须全部在环境或非环境中”

问题描述

我正在尝试创建一个重载函数getDefaultPath,以便它只能接受某些类型的组合。

我尝试使用函数签名声明,但是这两个函数声明都导致了令人困惑的错误消息:

过载签名必须全部是环境性的或非环境性的。

// type declartions
export enum TABS {
  TAB_A,TAB_B
}

export interface TabAParams {
   ...
}

export interface TabBParams {
   ...
}

// Overload signatures
export declare function getDefaultPath(tab: TABS.TAB_A,pathParams: TabAParams): string;
export declare function getDefaultPath(tab: TABS.TAB_B,pathParams: TabBParams): string;

// this function is to be overloaded
export function getDefaultPath(
  tab,pathParams
) {
  switch (tab) {
    case TABS.TAB_A:
      return getTabAPath(pathParams); // only accepts TabAParams
    case TABS.TAB_B:
      return getTabBPath(pathParams); // only accepts TabBParams
    default:
      throw new UnreachableCaseError(tab);
  }
}

// helps to avoid missing cases
export default class UnreachableCaseError extends Error {
  constructor(val: never) {
    super(`Unreachable case: ${val}`);
  }
}

解决方法

只需从重载中删除declare一词,错误就会消失。

还考虑到没有正确检查类型的实际实现,并且不能更改为检查类型,这是您尝试实现它的一种方式,同时考虑了TS当前所具有的功能。只需检查此功能的使用情况即可