Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 条件返回类型和文本缩小_Typescript_Typescript Typings_Typescript Generics - Fatal编程技术网

Typescript 条件返回类型和文本缩小

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扩展“打开”?'是的,从来没有{ 如果(操作==‘打开’){ 返回“是” } } 这

我只是不明白为什么它不能编译(TS 3.4.3)。有人能给我解释一下或更正一下我的密码吗?我错过了什么

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
用于从不返回的函数(通常在函数总是抛出异常时使用)-希望它能澄清;)