簡體   English   中英

TypeScript:返回類型將所有鍵指定為參數

[英]TypeScript: Return type has all keys specified as parameter

我想以某種方式鍵入一個函數,返回類型將是一個對象,它包含數組中指定的鍵作為參數。 這些鍵也應該是特定的枚舉類型。 我已經嘗試了幾件事,但無法讓它發揮作用。 也許有人知道它是否可能,以及如何?

enum Status {
  TIME = 'time',
  LOCATION = 'location'
}

function getStatus(statusToGet: Status[]) {
  // This function will always return an object containing all passed in
  // status as a key and boolean as a value, e.g.
  return statusToGet.reduce((prev, stat) => {
    prev[stat] = true; // or false
    return prev;
  }, {});
}

getStatus([]) // -> {}
getStatus([Status.TIME]) // -> { time: true }
getStatus([Status.TIME, Status.LOCATION]) // -> { time: true, location: false }

是否可以正確鍵入getStatus函數,以便TS知道返回類型中的哪些鍵?

您可以使用映射類型將字符串文字類型數組映射到對象:

enum Status {
    TIME = 'time',
    LOCATION = 'location'
}

function getStatus<T extends Status>(statusToGet: T[]): { [P in T]: boolean } {
    return null as any;
}

getStatus([]) // -> {}
getStatus([Status.TIME]) // -> { time: true }
getStatus([Status.TIME, Status.LOCATION]) // -> { time: true, location: false }

注意如果未啟用嚴格的空檢查,上面的代碼將返回空數組的{ [s:string] :any} 發生這種情況是因為T將被推斷為any 為了解決這個問題,我們可以使用條件類型來測試T是否為any並明確地返回{} (對於來自此答案的任何測試,10x到@jcalz)。 這是否意味着中的任意陣列any會產生{}但由於我們預計枚舉值的數組不是任何數組這migh沒有太大的問題,實際上可能是一個特征。

function getStatus<T extends Status>(statusToGet: T[]): true extends false & T?  {} : { [P in T]: boolean } {
     return null as any;
}

暫無
暫無

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

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