Подразумеваемый тип TypeScript

#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. Спасибо!! Это именно то, что я искал!