通过添加新类型对可区分的联合进行类型检查
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>
假设我有以下打字稿类型:
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>