[英]TypeScript: Typing generic interface's method parameter by reading a value from the generic type
[英]Generic method's typing with generic type as a parameter does not work properly
考慮以下代碼:
class Events<T extends object> {
raiseEvent<K extends keyof T>(key: K, value: T[K]) {
// do something here
}
}
interface EventsDictionary {
somethingHappened: number
whatever: string
}
interface AdditionalEvents {
disconnnected: CloseEvent
}
type AddAdditional<T extends object> = Omit<T, keyof AdditionalEvents> & AdditionalEvents
const events = new Events<AddAdditional<EventsDictionary>>()
events.raiseEvent("disconnnected", new CloseEvent("...")) // works fine
現在,如果我們在另一個同樣通用的 class 中使用這個 class :
class SomeOtherClass<Something extends object> {
constructor() {
const events = new Events<AddAdditional<Something>>()
events.raiseEvent("disconnnected", new CloseEvent("..."))
// ^^^^^^^^^^^^^^^^^^^^^
// Argument of type 'CloseEvent' is not assignable to parameter of type 'Something["connnected"] & CloseEvent'.
// Type 'CloseEvent' is not assignable to type 'Something["connnected"]'.ts(2345)
}
}
我不確定如何解決這個問題。
泛型參數指定不夠,需要擴展AditionnalEvents
class SomeOtherClass<Something extends AdditionalEvents> {
constructor() {
const events = new Events<AddAdditional<Something>>()
events.raiseEvent("disconnnected", new CloseEvent("..."))
}
}
對我來說,您的AddAdditional
類型也很奇怪。 它應該是像下面這樣的工會嗎?
class Events<T extends object> {
raiseEvent<K extends keyof T>(key: K, value: T[K]) {
// do something here
}
}
interface EventsDictionary {
somethingHappened: number
whatever: string
}
interface AdditionalEvents {
disconnnected: CloseEvent
}
const events = new Events<EventsDictionary & AdditionalEvents>()
events.raiseEvent("disconnnected", new CloseEvent("...")) // works fine
class SomeOtherClass<Something extends AdditionalEvents> {
constructor() {
const events = new Events<Something & AdditionalEvents>()
events.raiseEvent("disconnnected", new CloseEvent("..."))
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.