Typescript 为什么带约束的泛型参数类型不能匹配模式,而直接使用约束类型可以匹配模式?
我正在构建一个类型化事件utils,并希望提供定制的事件类型来支持。这个想法来自于。在中,我无法向扩展预定义事件添加泛型类型。我不知道如何修理它。有办法解决吗 更新:演示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
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]: