TypeScript中CustomEventCreator类型不兼容错误求助
问题解决:TypeScript CustomEventCreator 类型不匹配错误
你的问题和initEvent()废弃无关,核心是返回的函数类型与定义的条件返回类型不兼容:定义的条件类型要求,当T不是undefined时,函数必须接收必填的CustomEventInit<T>参数,但实际返回的函数允许参数可选,导致类型不匹配。
修正方案
可以通过函数重载来实现预期的类型约束,同时保持逻辑简洁:
export function createCustomEventCreator<T>(eventName: string, defaultOptions?: EventInit): T extends undefined ? () => CustomEvent<T> : (options: CustomEventInit<T>) => CustomEvent<T>; export function createCustomEventCreator<T>(eventName: string, defaultOptions?: EventInit) { return (options?: CustomEventInit<T>): CustomEvent<T> => { return new CustomEvent<T>(eventName, { ...defaultOptions, ...options }); }; }
或者,如果你更倾向于保持原有的箭头函数写法,可以调整返回类型的条件判断,让它和实际返回的函数类型对齐:
export const createCustomEventCreator = <T>( eventName: string, defaultOptions?: EventInit ): ( undefined extends T ? (options?: CustomEventInit<T>) => CustomEvent<T> : (options: CustomEventInit<T>) => CustomEvent<T> ) => { return (options?: CustomEventInit<T>): CustomEvent<T> => { return new CustomEvent<T>(eventName, { ...defaultOptions, ...options }); }; };
说明
- 第一种重载方案更符合TypeScript的类型习惯,能清晰区分两种调用场景:当
T为undefined时,调用不需要传参;当T有具体类型时,必须传options参数。 - 第二种方案是调整了原条件类型中的无参分支,允许参数可选,让返回函数的类型和定义的类型完全匹配,从而消除错误。
内容的提问来源于stack exchange,提问作者Ivan Ari Di Paolo
相关产品推荐
相关产品推荐

