You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:45:30