#typescript #generics
#typescript #общие
Вопрос:
У меня есть этот класс, и мне интересно, смогу ли я упростить это:
export class A<TB extends B<TC>, TC> implements TD<TB, TC> {
make(): TC {}
}
Потому что прямо сейчас мне нужно устанавливать тип TC всякий раз, когда я хочу создать A, например:
class CTest {}
class BTest extends B<CTest> {}
const a = new A<BTest, CTest>();
a.make() // -> CTest
Этот тип TC уже является аргументом общего типа B tho . Есть ли способ уменьшить это, чтобы в конечном итоге это выглядело примерно так:
export class A<TB extends B<TC>> implements TD<TB, TC> {
make(): TC {}
}
class CTest {}
class BTest extends B<CTest> {}
const a = new A<BTest>();
a.make() // -> CTest
Ответ №1:
Конечно. Общий способ извлечения общего параметра выглядит следующим образом.
Для данного интерфейса, который включает в себя общий тип, например:
type C = {c:number}
interface B<TC> {x:TC}
Вы можете извлечь общий тип, используя условный тип с помощью infer:
type ExtractC<T> = T extends B<infer TC> ? TC : never
И так для типа с общим:
type BX = B<C>
Вы можете извлечь общий параметр:
type Y = ExtractC<BX> // type Y inferred as {c:number}
Игровая площадка здесь.
Что infer TC
означает в приведенном выше выражении, в основном, «TC — это любой тип, который здесь найден». Другими словами, вы можете думать о infer TC
создании новой переменной, которую затем можно использовать в своем условном назначении. Вот почему много раз вы увидите, что он написан как infer X
, что наводит на мысль о «переменной-подобной» природе типа, выведенного с помощью оператора infer .
Я думаю, что с помощью этой информации вы сможете легко упростить свой тип. Но если вы хотите опубликовать игровую площадку своего кода, я буду рад дать дополнительные указания.
Комментарии:
1. Спасибо!! Это именно то, что я искал!