问题描述
我正在尝试创建一个重载函数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当前所具有的功能。只需检查此功能的使用情况即可