【发布时间】:2021-02-02 09:10:32
【问题描述】:
考虑下面的代码,我创建了一个类,它有一个构造函数,它接收一个泛型类型的参数,用于定义第二个参数接收到的参数的类型,在下面的例子中回调函数是MouseEvent,因为第一个参数的值:
class MyClass<T extends keyof HTMLElementEventMap>{
constructor(tagName: T, lister: (ev: HTMLElementEventMap[T]) => any) { }
}
new MyClass("click", ev => { })
// ^^ (parameter) ev: MouseEvent
但是,如果我创建一个函数,其其余参数的类型为 ConstructorParametersEvent | UIEvent | AnimationEvent | MouseEvent | FocusEvent | DragEvent | ErrorEvent | PointerEvent | ... 6 more ... | ClipboardEvent
function myFunction(...args: ConstructorParameters<typeof MyClass>) {}
myFunction("click", ev => { })
// ^^ (parameter) ev: Event | UIEvent | AnimationEvent | MouseEvent | FocusEvent | DragEvent | ErrorEvent | PointerEvent | ... 6 more ... | ClipboardEvent
如何在不重写myFunction 函数的类型的情况下获得回调参数的正确类型?
有可能吗?
【问题讨论】:
-
Ehhh,没有高阶类型操作可以纯粹在类型级别执行此操作。你可以通过对higher order inference from generic functions 的一些轻微滥用来获得你想要的东西,比如this...这对你有用吗?如果是这样,我会写一个答案。
-
哇!这是魔法吗?我不太明白它是如何工作的,但它确实有效,你能更好地解释一下吗?
-
我注意到这会生成 JS 代码,这种方法不仅在“类型”领域,您能说一下为什么会这样吗?是否有任何解决方案不会生成更多的 JS 代码?
-
正如我所说,我不知道有任何解决方案可以纯粹在类型级别上工作。它可能需要microsoft/TypeScript#1213 中请求的更高种类的类型,但这些不是语言的一部分。
-
感谢您的帮助,请给出答案,以便我将其标记为有用。
标签: typescript arguments