首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法传递到包装函数中的args

无法传递到包装函数中的args
EN

Stack Overflow用户
提问于 2022-06-01 12:20:32
回答 2查看 45关注 0票数 1

我有几个模块(或网桥)遵循如下相同的格式:

代码语言:javascript
运行
复制
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处理。然而,这些模块中的功能将需要一种使之成为通用的回退机制。

代码语言:javascript
运行
复制
export type BridgeFunctions = keyof Bridge;
代码语言:javascript
运行
复制
/* 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将返回以下错误:

代码语言:javascript
运行
复制
A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)

尝试使用call和apply,这导致了这个错误:

代码语言:javascript
运行
复制
The 'this' context of type ... is not assignable to method's 'this' of type '(this: any[]) => Promise<any>'.

根据我的理解,在香草Javascript中,将args直接传递给fn应该是可行的。如何在TypeScript中模仿相同的内容呢?

编辑:

桥接模块的用途如下:

代码语言:javascript
运行
复制
function getBridge(): Bridge {
  if (inIOS()) {
    return await import('./ios');
  }
  // ...
  return await import ('./web');
}
代码语言:javascript
运行
复制
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);
    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-02 21:14:54

我就是这样做的。

基本上,您希望确保用户将有效的参数传递给函数。为此,您将args设置为传递的in函数的参数。

代码语言:javascript
运行
复制
export async function fallback<FN extends keyof Bridge>(fnName: FN, args: Parameters<Bridge[FN]>){

然后,要绕过错误,只需将fn键入任意:

代码语言:javascript
运行
复制
const fn = fallbackBridge[fnName] as any;
return fn(...args);

在这里使用any是可以的,因为您已经知道这些类型是兼容的。

票数 0
EN

Stack Overflow用户

发布于 2022-06-01 13:34:03

这里的问题是,您的fallbackBridge函数需要一定数量的参数,但是您给它们类型“any[]”,可以有任何长度。

您可以使用return fn(...(args as Parameters<typeof fn>));绕过此错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72461799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档