我有一個型別的物件A,我希望將其轉換為型別B。具有基本不變性的最簡單方法是淺克隆此物件并洗掉無關屬性。
type A = B & {
prop1;
}
type B = {
prop2;
}
const example = (oldA: A): B => {
const newB = { ...oldA };
delete newB.prop1;
return newB as B;
}
如果不使用 分配型別as,TypeScript 不理解回傳值是正確的回傳型別。
我不喜歡as盡可能使用,因為這很容易出錯。如果我將臨時變數分配為 type A,那么我無法洗掉而不會出現錯誤
const newB: A = { ..oldA }
“洗掉”運算子的運算元必須是可選的
在線閱讀后,我看到我可以使用這個符號;
const example = (oldA: A): B => {
const newB: Partial<Pick<A, 'prop1'>> & Omit<A, 'prop1'> = { ...oldA };
delete newB.prop1;
return newB;
}
這很好用,但我想將它作為通用重用。我嘗試了下面的泛型型別,但出現兩個錯誤
type PartialProperty<X, Y> = Partial<Pick<X, Y>> & Omit<X, Y>
型別“Y”不滿足約束“keyof X”
型別 'Y' 不滿足約束 'string | 號碼 | 象征'
如何正確地將 TypeScript 定義撰寫為可重用的泛型?
uj5u.com熱心網友回復:
Pick<T, K>實用程式型別要求K可分配給,keyof T而實用程式型別要求可分配給某些類似鍵的型別(,也稱為)。Omit<T, K>Kstring | number | symbolPropertyKey
您的定義的問題PartialProperty在于您的第二個“關鍵”引數(您正在呼叫Y但我將呼叫K它,因為它更傳統)根本沒有受到限制。您不能將其作為第二個型別引數傳遞給Pick或Omit除非您將其限制為適當的鍵型別。在像這樣的泛型型別引數宣告中,type Foo<T> = ...您可以添加一個約束,type Foo<T extends XXX> = ...這樣在 a 中傳遞的任何型別引數都T必須可以分配給XXX.
這是它的外觀PartialProperty:
type PartialProperty<X, K extends keyof X> =
Partial<Pick<X, K>> & Omit<X, K>
編譯沒有錯誤,因為 nowK被限制為keyof X,它同時滿足Pick(since Kextends keyof X) 和Omit(since Kextends keyof Xwhich extends PropertyKey)。
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/511348.html
標籤:打字稿仿制药类型
下一篇:使用反射從泛型結構中獲取型別引數
