TypeScript:重载函数时"Overload signatures must all be ambient or non-ambient"



我正在尝试创建一个重载函数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目前的情况,您正在尝试实现它。只会正确检查此功能的使用情况

还有另一种不显式使用重载的方法。js/ts中函数的参数只是一个数组。TS允许您指定数组中各个元素的类型。因此以下是可能的:

type GetDefaultPathParams = (
[TABS.TAB_A, TabAParams] |
[TABS.TAB_B, TabBParams]
);
export function getDefaultPath(...params: GetDefaultPathParams)
{
const tab = params[0];
const pathParams = params[1];
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);
}
}

相关内容

最新更新