簡體   English   中英

泛型方法以泛型類型作為參數的類型不能正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM