簡體   English   中英

獲取鍵的類型以定義函數參數

[英]Getting the type for an key to define function argument

我有一個類似下面例子的類型

export type Signals = {
    activity: boolean;
    quest: string;
    creator: number;
}

使用這種類型,我將獲得一個具有以下屬性的函數

export function initStation<T>(){
    return {
        signal: (id: keyof T, value: T[keyof T]){
            // code
        }
    }
}

但是當我使用這個實現時,我總是有一個聯合類型 vor 值參數。 即使將 id 參數設置為活動、任務或創建者。

我試圖獲得更好的支持,例如當 id 等於活動時,可能的類型只是一個布爾值,因為在我上面的類型中活動被定義為布爾值。

我希望像這樣調用我的函數

const station = initStation<Signals>()

station.signal('activity', true); // fine
station.signal('quest', 'any quest'); // fine
station.signal('creator', 1234); // fine

當我嘗試使用如下函數時出現錯誤

station.signal('activity', 'abc'); // error
station.signal('quest', 123); // error
station.signal('creator', true); // error

如果idkeyof T類型並且valueT[keyof T]類型,那么它們都是不相關的聯合類型,並且沒有什么可以阻止某人傳入一個id和一個對應於T不同屬性的value 解決這個問題的一種方法是讓你的方法在id類型中通用K extends keyof T ,然后用它來表示value

export function initStation<T>() {
  return {
    signal: <K extends keyof T>(id: K, value: T[K]){
      // code
    }
  }
}

這給了你你想要的行為:

const station = initStation<Signals>();

station.signal('activity', true); // fine
station.signal('quest', 'any quest'); // fine
station.signal('creator', 1234); // fine
station.signal('activity', 'abc'); // error
station.signal('quest', 123); // error
station.signal('creator', true); // error

游樂場代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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