对于给定的接口:
enum Foo {
A = 'a',
B = 'b'
}
Interface Bar {
name: Foo,
values: number | number[]
}
当 values
为 Bar
时,如何在 number
中键入 name
为 Foo.A
类型,而当 number[]
为 name
时}} 是 Foo.B
?
同样,对于函数:
function baz(name: Foo, values: number | number[])
如何根据 values
的值键入 name
?
答案 0 :(得分:2)
Bar
可以定义为一个联合,其中 TypeScript 可以根据 name
的类型判断预期的部分——这种联合被称为 discriminated union:
type Bar =
{
name: Foo.A;
value: number;
}
|
{
name: Foo.B;
value: number[];
};
同样,函数可以通过重载来定义:
function baz(name: Foo.A, values: number): void;
function baz(name: Foo.B, values: number[]): void;
function baz(name: Foo, values: number | number[]): void {
// Handle checking whether `value` is an array
}