我正在嘗試創建一個通用型別檢查函式來檢查物件的屬性是否具有型別。但是,如果我不需要將欄位定義為引數值和型別值,那就太好了。
例如,這可行,但感覺有點多余:
function isFieldPopulated<T1, T2, K extends keyof T1>(doc: T1, field: K): doc is Omit<T1, K> & Record<K, T2> {
// check if T1[K] is a T2
return ...;
}
if (isFieldPopulated<Post, Category, 'category'>(data, 'category')) {
// data.category is a Category type
}
我希望不必在此處<Post, Category, 'category'>和此處設定“類別” (data, 'category')。有沒有辦法讓 TS 知道該field引數擴展了 keyof T1 而不必專門將“類別”放入其中,<..., 'category'>因為它已經作為字串引數傳遞?
更新:這是一個最小的作業示例。
uj5u.com熱心網友回復:
因為 TypeScript 已經可以為我們正確推斷T1,K所以不需要顯式提供T2. 似乎您只想要物件型別而不是原始型別(如string),所以我們可以給出T2type Extract<T1[K], object>,給我們所有的物件型別T1[K]:
function isFieldPopulated<T1, T2 extends Extract<T1[K], object>, K extends keyof T1>(doc: T1, field: K): doc is T1 & Record<K, T2> {
您可以在此處驗證它是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481034.html
