请问 ts 可选参数的如何声明?

type = PanelRequire = string | Object
interface AllEvent {
    event1: [number, string]
    event2: [Array<>, number, Object]
    ToggleClass: [PanelRequire, string, boolean]
    AddClass: [PanelRequire, string]
}
function FireEvent<
    T extends panoramaEventDeclarations,
    K extends keyof T,
    >(event: K, ...args: T[K]):void {// args报错:rest 参数必须是数组类型。
        action(event, ...args)
// args报错:类型“T[K]”必须具有返回迭代器的 "[Symbol.iterator]()" 方法。
// event报错:类型“string | number | symbol”的参数不能赋给类型“string”的参数。
//            不能将类型“number”分配给类型“string”。
}

对于函数 FireEvent 根据不同的事件名 有不同的参数数量和要求,明确每个参数的类型。
事件数量巨大,并不能全部写类型重载。
用接口还是类型实现都可以。方便业务中手动增加事件的最好。

阅读 2.9k
2 个回答

这样可以吗?

type PanelRequire = {};
interface AllEvent
{
    event1: [number, string];
    event2: [Array<any>, number, Object];
    ToggleClass: [PanelRequire, string, boolean];
    AddClass: [PanelRequire, string];
}

declare function fireEvent<EVENT extends keyof AllEvent>(event: EVENT, ...args: AllEvent[EVENT]);


fireEvent('event1', 1, 'abc');
fireEvent('event2', [1, 2, 3], 1, { a: 1, b: 2 });
fireEvent('ToggleClass', {}, 'class1', true);
fireEvent('AddClass', {}, 'class1');

第一个报错:你可以将...args的类型定义为T[K],但是类型为T[K]的值,不一定是个可迭代对象。

action(event, ...args) // 这里不能直接使用展开运算符

MDN链接:展开运算符

在数组或函数参数中使用展开语法时,该语法只能用于 可迭代对象:

第二个问题看不懂。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进