türler - TypeScript'te parametrik birleşim


Bir birleşimi parametrik olarak belirtmenin genel bir yolu var mı? Ben, şu gibi bir şeyi genel olarak belirtmenin bir yolunu arıyorum:

type U<K> = T<K1> | T<K2> | ... | T<Kn> // Where K === (K1 | ... | Kn)

Not: T<U | V> !== T<U> | T<V> durumu ile ilgileniyorum. (#14107 ve #16644’ın tam tersine bir durum)

Düzenle: K bir string sabitler birliği olduğunda aşağıdaki deseni keşfettim:

type U<K> = {[key in K]: T<key>}[K]

ama bunu bir fonksiyon argümanı olarak kullanmaya çalışırsam tür çıkarımıyla iyi çalışmıyor.

Cevap #1

TypeScript 2.8, bu dağıtımı gerçekleştirmek için koşullu tipler kullanarak başka bir yol sunar. Yayın duyurusundan bir örnek:

type Foo<T> = T extends any ? T[] : never;

/**
 * Foo distributes on 'string | number' to the type
 *
 *    (string extends any ? string[] : never) |
 *    (number extends any ? number[] : never)
 * 
 * which boils down to
 *
 *    string[] | number[]
 */
type Bar = Foo<string | number>;