Kavşak için birleşmek mi istiyorsunuz? Dağıtık koşullu türler ve koşullu türlerden çıkarım bunu yapabilir. (Yine de birleşmek için kesişim yapmanın mümkün olduğunu düşünmeyin, üzgünüm) İşte kötü sihir:
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
Bu, sendikayı dağıtır ve Utüm konseylerin çelişkili bir konumda olduğu yeni bir birliğe yeniden paketler. Bu I, el kitabında belirtildiği gibi türün bir kesişim olarak çıkarılmasına izin verir :
Benzer şekilde, karşıt varyant konumlarında aynı tür değişken için birden fazla aday, bir kesişim türünün çıkarılmasına neden olur.
İşe yarayıp yaramadığını görelim.
Öncelikle parantezlememe izin verin FunctionUnionve FunctionIntersectionTypeScript birleşimi / kesişimi function return'ten daha sıkı bir şekilde bağladığı için:
type FunctionUnion = (() => void) | ((p: string) => void);
type FunctionIntersection = (() => void) & ((p: string) => void);
Test yapmak:
type SynthesizedFunctionIntersection = UnionToIntersection<FunctionUnion>
İyi görünüyor!
Genel olarak UnionToIntersection<>, TypeScript'in gerçek bir birliktelik olduğunu düşündüğü bazı ayrıntıları ortaya çıkardığına dikkat edin . Örneğin boolean, görünüşe göre dahili olarak temsil edilir true | false, yani
type Weird = UnionToIntersection<string | number | boolean>
olur
type Weird = string & number & true & false
TS3.6 + 'da hevesle indirgenen
type Weird = never
çünkü string ve number ve true ve olan bir değere sahip olmak imkansızdır false.
Umarım yardımcı olur. İyi şanslar!