Typescript 条件返回类型和文本缩小
我只是不明白为什么它不能编译(TS 3.4.3)。有人能给我解释一下或更正一下我的密码吗?我错过了什么Typescript 条件返回类型和文本缩小,typescript,typescript-typings,typescript-generics,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' } } 函数运行(操作:A):A扩展“打开”?'是的,从来没有{ 如果(操作==‘打开’){ 返回“是” } } 这
function run<A extends 'open'>(action: A): A extends 'open' ? 'yes' : never {
if (action === 'open') {
return 'yes'
}
}
函数运行(操作:A):A扩展“打开”?'是的,从来没有{
如果(操作==‘打开’){
返回“是”
}
}
这个例子可以归结为不工作的部分。这意味着它是一个通过特定操作(a)调用的函数,每个操作都应该有定义的返回值
操作“打开”返回“是”或“否”
操作“发送”返回“成功”或“失败”
等等
我在这里遇到的错误:
函数缺少结束返回语句,返回类型不包括“undefined”
类型“yes”不可分配给类型“A”扩展“open”?“是”:永远不会
Typescript完全可以这样做吗?Typescript现在不允许
A
将打开,
即使您检查操作
参数。类型防护装置对A
没有影响,仅对动作有影响。这意味着typescript无法基于该类型解析条件类型
简单的解决方法是使用单独的公共签名和条件类型,但让实现签名返回一个联合
另外,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'
}
}
函数运行(操作:A):A扩展“打开”?'是“:无效
函数运行(操作:A):“是”|无效
{
如果(操作==‘打开’){
返回“是”
}
}
非常感谢您的解释!我将带着两个签名去。我需要了解虚无、未定义和从不之间的区别。。。它仍然让我困惑void
和never
是返回函数的两种特定类型(never
可能用于条件类型,但它是另一个主题),而undefined
用于变量或参数undefined
只是javascript类型void
用于不返回任何内容的函数,而never
用于从不返回的函数(通常在函数总是抛出异常时使用)-希望它能澄清;)