TypeScript 永远不会在条件类型中输入不一致匹配?

tru*_*ktr 5 typescript

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

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 `[]`
Run Code Online (Sandbox Code Playgroud)

游乐场链接

Nur*_*yev 13

你真正想问的是:

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`!
Run Code Online (Sandbox Code Playgroud)

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

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

type Bar<T> = [T] extends [never] ? true : false
type Baz = Bar<never> // true as expected
Run Code Online (Sandbox Code Playgroud)

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

UPD:为什么never是“空联合”?好吧,也许这段代码会证明它:

type Union1 = number | string | never // number | string
type Union2 = number | never // number
type Union3 = never // never aka empty union
Run Code Online (Sandbox Code Playgroud)