Оператор ненулевого утверждения для универсального типа в Typescript

#typescript #typescript-generics

Вопрос:

Следующий код:

 type A = number | undefined
type B<C extends number> = C
let a: B<A>;
 

выдаст мне ошибку:

Type 'A' does not satisfy the constraint 'number'. Type 'undefined' is not assignable to type 'number'.


Можно ли предположить, что A будет определено, что-то вроде:

 let a: B<A!>
// or
let a: B<NonNullable<A>>
 

?

Ответ №1:

Этот оператор ненулевого утверждения предназначен для использования для javascript переменных. Использовать его для типов машинописи в принципе не имеет смысла.

Я почти уверен, что ваша проблема исходит из другого места, которое заставляет вас действовать таким образом и которое вам нужно решить вместо этого.

В любом случае, если вы хотите решить эту проблему быстро, вам может потребоваться использовать Exclude тип утилиты.

Полное решение:

 type A = number | undefined
type B<C extends number> = C
const a: B<Exclude<A, undefined>> = 234;