在提供默认参数时,类型缩窄会失败

前端开发 2026-07-09

使用TypeScript v6.0.3(也在更早的版本上测试过,最早追溯到v4.9.5),我在缩窄作为对象传入的函数选项的类型。其中一些参数有默认值。就我所知,具有默认值的参数在TypeScript的自动类型判断方面似乎并不能正常工作。

为什么在 if 代码块中,fun1 无法收窄 t 的类型,而 fun2 能基于定义正确地收窄其类型?这是一个错误吗?

type Type = {
    b?: false,
    t: number,
} | {
    b: true,
    t: string,
}

// This doesn't work
function fun1({b = true, t}: Type) {
        if(b) {
            t /* <-- can't discern type as 'string' only, is 'string|number' */
        }
}

// This works
function fun2({b, t}: Type) {
        if(b) {
            t /* <-- can discern type as 'string' */
        }
}

Playground

注:此问题确实存在一个错误,即 undefined 的情况出现在 b: false 选项上,而不是 b: true 选项上,正如几位网友所指出的。我已提交 一个修正后的问题,它演示了实际的问题(如评论中的 @MattKantor指出的那样)

解决方案

如果 b 未定义,则 t 必须是一个数字。

如果 b 为true,则 t 必须是一个字符串。

由于将默认选项设置为 b=true,初始未定义时 b 为true,因此 t 可能是字符串,也可能是数字。

例如,fun1({b: true, t: 'x'})fun1({t: 1}) 都通过了,但 fun1({t: 'x'}) 没有通过,你可能会以为它也会通过,因为 {b:true,t:'x'} 是一个有效的 Type

playground

[playground]

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章