我有几个模块(或网桥)遵循如下相同的格式:
export interface Bridge {
foo: (a: string, b: boolean, c: string) => number;
bar: (a: number, b: number, c: string, d: string) => string;
x: (a: string) => boolean;
y: () => null;
}因此,我需要创建一个层来导入相应的模块,而不是一些if-else处理。然而,这些模块中的功能将需要一种使之成为通用的回退机制。
export type BridgeFunctions = keyof Bridge;/* Called when a particular bridge throws an error */
export async function fallback(fnName: BridgeFunctions, ...args: any[]): Promise<any> {
const fallbackBridge = await import('./fallbackBridge');
const fn = fallbackBridge[fnName];
return fn(...args);
}但是,VSCode将返回以下错误:
A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)尝试使用call和apply,这导致了这个错误:
The 'this' context of type ... is not assignable to method's 'this' of type '(this: any[]) => Promise<any>'.根据我的理解,在香草Javascript中,将args直接传递给fn应该是可行的。如何在TypeScript中模仿相同的内容呢?
编辑:
桥接模块的用途如下:
function getBridge(): Bridge {
if (inIOS()) {
return await import('./ios');
}
// ...
return await import ('./web');
}export function foo(a: string, b: boolean, c: string): number {
try {
const bridge = await getBridge();
return bridge.foo(a, b, c);
} catch (error: any) {
// ...
if (error.bridge.failed) {
return await fallback('foo', a, b, c);
}
}
}发布于 2022-06-02 21:14:54
我就是这样做的。
基本上,您希望确保用户将有效的参数传递给函数。为此,您将args设置为传递的in函数的参数。
export async function fallback<FN extends keyof Bridge>(fnName: FN, args: Parameters<Bridge[FN]>){然后,要绕过错误,只需将fn键入任意:
const fn = fallbackBridge[fnName] as any;
return fn(...args);在这里使用any是可以的,因为您已经知道这些类型是兼容的。
发布于 2022-06-01 13:34:03
这里的问题是,您的fallbackBridge函数需要一定数量的参数,但是您给它们类型“any[]”,可以有任何长度。
您可以使用return fn(...(args as Parameters<typeof fn>));绕过此错误。
https://stackoverflow.com/questions/72461799
复制相似问题