通过添加新类型对可区分的联合进行类型检查

Type checking discriminated unions with adding new types

假设我有以下打字稿类型:

enum EntityKind {
  Foo = 'foo',
  Bar = 'bar',
}

type Foo = {
  kind: EntityKind.Foo,
  foo: string
}

type Bar = {
  kind: EntityKind.Bar,
  bar: number
}

type Entity = (Foo | Bar) & {
  id: string,
  name: string
}

我想要的是在我向枚举添加新类型时能够让类型检查器失败。所以我希望的是:

enum EntityKind {
  Foo = 'foo',
  Bar = 'bar',
  Baz = 'baz',
}

我会遇到某种错误,要求我定义一个新类型 Baz 并将其添加到联合中。

这可能吗?

如果您想要类型 Entity 中的错误,您可以将另一种类型添加到需要 EntityKind 扩展 EntityUnion['kind']:

的交集
enum EntityKind {
  Foo = 'foo',
  Bar = 'bar',
}

type Foo = {
  kind: EntityKind.Foo,
  foo: string
}

type Bar = {
  kind: EntityKind.Bar,
  bar: number
}
type Check<T, U extends T> = {}

type EntityUnion = Foo | Bar 
type Entity = EntityUnion & {
  id: string,
  name: string
} & Check<EntityUnion['kind'], EntityKind>