当函数有重载时,有可能使TypeScript理解参数类型吗?

wztqucjr  于 2023-01-21  发布在  TypeScript
关注(0)|答案(1)|浏览(153)

我有一个带有两个重载的函数,当我调用这个函数时,重载可以正常工作,但是在函数体中,第二个参数的类型并没有根据第一个参数的值来缩小。

function foo(event: 'one', value: string): void;
function foo(event: 'two', value: number): void;
function foo(event: 'one' | 'two', value: string | number): void {
    event // 'one' | 'two'
    value // string | number
    if (event === 'one') {
        event // 'one'
        value // !!! string | number , Why not string??
    } else {
        event // 'two'
        value // !!! string | number , Why not number??
    }
}

当第一个参数为“一”时,是否可以具有value-string类型,当第一个参数为“二”时,是否可以具有number类型?

ctehm74n

ctehm74n1#

是的,如果你在rest参数中使用一个元组的并集,并且在参数中直接解构元组,事实上,使用这个你甚至不再需要重载,元组并集将被表示为重载:

function foo(...[event, value]: 
  | [event: 'one', value: string]
  | [event: 'two', value: number]): void {
    event // 'one' | 'two'
    value // string | number
    if (event === 'one') {
        event // 'one'
        value // string
    } else {
        event // 'two'
        value // number
    }
}

Playground链接
局限性:仅当元组联合是区分联合(您的是)时才有效。

相关问题