打字稿:键或参数的类型取决于另一个的值

时间:2021-04-14 11:13:54

标签: typescript

对于给定的接口:

enum Foo {
    A = 'a',
    B = 'b'
}

Interface Bar {
    name: Foo,
    values: number | number[]
}

valuesBar 时,如何在 number 中键入 nameFoo.A 类型,而当 number[]name 时}} 是 Foo.B

同样,对于函数:

function baz(name: Foo, values: number | number[])

如何根据 values 的值键入 name

1 个答案:

答案 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
}

Playground link