TypeScript 永远不会在条件类型中不一致地匹配类型



在下面的代码中,您注意到Result1的类型是 never ,但test3的类型是 [] 。我无法理解这一点。考虑到它们都从MyEvents读取never类型,为什么结果不一样?

type EventArgs<EventTypes, K extends keyof EventTypes> =
    EventTypes[K] extends never /* CHECK NEVER */
        ? []
        : EventTypes[K] extends any[]
            ? EventTypes[K]
            : [EventTypes[K]];
type foo<T> = T extends never /* CHECK NEVER */ ? [] : [boolean]
type Result1 = foo<MyEvents['anotherEvent']> // HERE, type is `never`
type MyEvents = {
    anotherEvent: never // event has no args
}
type Result2 = EventArgs<MyEvents, 'anotherEvent'> // HERE, type is `[]`

游乐场链接

你真正要问的是:

type Foo = never extends never ? true : false // gives true
//but
type Bar<T> = T extends never ? true : false
type Baz = Bar<never> // not `true` as expected but `never`!

好吧,我对此感到好奇,想知道它是否与分发条件类型有关。

所以我将上面的代码改成了这样:

type Bar<T> = [T] extends [never] ? true : false
type Baz = Bar<never> // true as expected

因此,答案是:您正在分发一个空联合(又名never),这给出了一个空联合(又名never)分布的结果:这是另一个空联合!完全有道理!

UPD:为什么never是一个"空工会"?好吧,也许这段代码将演示它:

type Union1 = number | string | never // number | string
type Union2 = number | never // number
type Union3 = never // never aka empty union

最新更新