条件返回类型和文字范围缩小

时间:2019-04-19 13:25:50

标签: typescript typescript-typings typescript-generics

我只是不明白为什么它不能编译(TS 3.4.3)。有人可以向我解释或更正我的代码吗?我在这里想念什么?

function run<A extends 'open'>(action: A): A extends 'open' ? 'yes' : never {
    if (action === 'open') {
        return 'yes'
    }
}

此示例归结为不起作用的部分。它的意思是要通过某些Actions(A)调用该函数,并且每个函数都应具有定义的返回值。

操作“打开”返回“是”或“否” 动作“发送”返回“成功”或“失败” 等

我到达这里时出错:

  

函数缺少结尾的return语句,并且返回类型不包含'undefined'

     

类型'“ yes”'是否可分配给类型'A扩展为“ open”? “是”:永远不会

Typescript完全可以吗?

1 个答案:

答案 0 :(得分:1)

即使您选中A参数,Typescript现在也不认为'open'将是action。类型防护仅对A不会对action产生影响。这意味着打字稿无法基于该类型防护来解析条件类型。

简单的解决方法是使用带有条件类型的单独的公共签名,但是让实现签名返回一个并集。

never并不意味着它什么也不返回,它意味着它永不返回,您正在寻找void

function run<A extends 'open'>(action: A): A extends 'open' ? 'yes' : void
function run<A extends 'open'>(action: A): 'yes' | void 
{
    if (action === 'open') {
        return 'yes'
    }
}