#Weird type inference for parametric type alias

13 messages · Page 1 of 1 (latest)

quaint token
#

Code:

type eq<T, U> = T extends U ? U extends T ? 'true' : 'false' : 'false';

let foo : eq<boolean, true>;

Expected type for foo: 'false'
Actual type for foo: false | true

#

Playground link:

karmic sundialBOT
#
tahadb#0

Preview:```ts
type eq<T, U> = T extends U
? U extends T
? "true"
: "false"
: "false"

let foo: eq<false, boolean>
let bar: eq<true, boolean>
let baz: eq<true, false>
let bag: eq<false, false>
let far: eq<boolean, unknown>
let bat: eq<boolean, true>
let bam: eq<unknown, boolean>```

clever silo
#

When you compare types with extends it breaks out unions and compares each one

#

so boolean is effectively a union of false and true

#

so you get

true extends true extends true | false extends true extend false
===
true | false
#

It's called distribution, sigh

karmic sundialBOT
#
sandiford#0

Preview:```ts
type eq<T, U> = [T] extends [U]
? [U] extends [T]
? "true"
: "false"
: "false"

let foo: eq<boolean, true>```

clever silo
#

you can "fix" it by making your types into tuples

#

also

#
type Eq<A, B> = [A, B] extends [B, A] ? true : false
fringe flint
#

see also:

#

!hb dist