![](/img/trans.png)
[英]TypeScript: How to obtain return type of the instance of a generic function that has a specified parameter tuple type?
[英]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.