observe the below example:
type A = boolean;
type B = string;
type C<T extends B> = {
}
type D<T extends B|A> = T extends B ? C<T> : never
type E<T extends B|A> = [T] extends [B] ? C<T> : never
type F<T extends B|A> = T[] extends B[] ? C<T> : never // ERROR !!!!
It errors, and errors in a place that you don't expect
the error message:
Now normally when we extends
something don't expect, it will narrow down the type, eg:
type A<T extends string, number> = T extends string ? T : never
in the above code, the highlighted T
is narrowed down to string
And as you can see, this is not the case with T[] extends B[]
Now what if I tell you I lied? The error of T[] extends B[]
is work as expected, what is not expected is [T] extends [B]
with T[] extends B[]
the compiler will not narrow the type like how it narrow down T extends B
But [T] extends [B]
is a special case in the compiler, compiler will narrow down [T] extends [B]
like T extends B
, which is why [T] extends [B]
does not error
The error of T[] extends B[]
is expected because T[] extends B[]
suppose to narrow down T[]
not T
.
tips: another thing is both T[] extends B[]
and [T] extends [B]
both do not distribute
Top comments (0)