联合数据类型的条件数据类型

Conditional data types on union data types

假设您有以下类型:

type Foo = {
    prop1: 'foo',
    prop2: null
}

type Bar = {
    prop1: 'bar',
    prop2: number
}

type FooOrBar = Foo | Bar

是否可以使用条件类型重写上述代码?

我试过以下方法:

type FooOrBar = {
    prop1: 'foo' | 'bar'
    prop2: FooOrBar['prop1'] extends 'foo' ? null : number
}

但是当尝试像这样声明一个 var 时:

const sample1: FooOrBar = {
    prop1: 'foo',
    prop2: null
}

我收到以下错误:

Type 'null' is not assignable to type 'number'.

似乎 FooOrBar['prop1'] extends 'foo' 总是 false,但不应该是因为 FooOrBar['prop1']'foo' | 'bar'

的联合类型

我做错了什么?

您可以这样做,但您仍然需要明确提供类型参数。

type FooOrBar<T extends 'foo' | 'bar'> = {
  prop1: T;
  prop2: T extends 'foo' ? null : number;
}

const test: FooOrBar<'foo'> = {
  prop1: 'foo',
  prop2: null,
}