Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 为什么带约束的泛型参数类型不能匹配模式,而直接使用约束类型可以匹配模式?_Typescript_Typescript Generics - Fatal编程技术网

Typescript 为什么带约束的泛型参数类型不能匹配模式,而直接使用约束类型可以匹配模式?

Typescript 为什么带约束的泛型参数类型不能匹配模式,而直接使用约束类型可以匹配模式?,typescript,typescript-generics,Typescript,Typescript Generics,我正在构建一个类型化事件utils,并希望提供定制的事件类型来支持。这个想法来自于。在中,我无法向扩展预定义事件添加泛型类型。我不知道如何修理它。有办法解决吗 更新:演示 export type ListenerArgsType<T> = [T] extends [(...args: infer U) => any] ? U : [T] extends [void] ? [] : [T]; class TestEvent<TypedEventMap extend

我正在构建一个类型化事件utils,并希望提供定制的事件类型来支持。这个想法来自于。在中,我无法向扩展预定义事件添加泛型类型。我不知道如何修理它。有办法解决吗

更新:演示
export type ListenerArgsType<T> = [T] extends [(...args: infer U) => any]
  ? U
  : [T] extends [void] ? [] : [T];

class TestEvent<TypedEventMap extends {'update': {id: number}}> {
    constructor() {
        // this.emit('update', { id: 1 }) Error! 
        const events = new TestEvent<{ 'update': { id: number } }>()
        events.emit('update', {id: 1})
    }

    public emit<Type extends keyof TypedEventMap>(type: Type, ...data: ListenerArgsType<TypedEventMap[Type]>) {}
}
导出类型ListenerArgsType=[T]扩展[(…args:inferu)=>any]
? U
:[T]扩展[void]?[]:[T];
类测试事件{
构造函数(){
//此.emit('update',{id:1})错误!
const events=newtestevent()
emit('update',{id:1})
}
公共发射(类型:type,…数据:ListenerArgsType){}
}

为@rusev侧。我现在在函数体内部进行铸造。

为@rusev-side。我现在在函数体内部进行强制转换。

在函数体内部和调用端推断类似依赖类型的方式不同。除了在函数体内部强制转换之外,我还没有找到其他解决方案。你可能会对[这方面的工作][1]感兴趣。你可能会在那里发现更多的内幕。[1] :在函数体内部和调用端推断依赖类型的方式不同。除了在函数体内部强制转换之外,我还没有找到其他解决方案。你可能会对[这方面的工作][1]感兴趣。你可能会在那里发现更多的内幕。[1]: