我只是不明白为什么它不能编译(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完全可以吗?
答案 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'
}
}