【问题标题】:Conditional return type and literal narrowing条件返回类型和文字缩小
【发布时间】:2019-09-09 18:27:17
【问题描述】:

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

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

这个例子归结为不工作的部分。它是一个函数,通过某些动作 (A) 调用,并且每个动作都应该有定义的返回值。

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

我在这里遇到错误:

函数缺少结束返回语句,返回类型不包含'undefined'

类型 '"yes"' 不能分配给类型 'A extends "open" 吗? “是”:从不'

Typescript 完全可以吗?

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    即使您检查了 action 参数,Typescript 现在也不会认为 A 将是 'open'。类型保护对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'
        }
    }
    

    【讨论】:

    • 非常感谢您的解释!我会带着两个签名去。而且我需要阅读 void、undefined 和 never 之间的区别......它仍然让我感到困惑?
    • voidnever 是返回函数的两种特定类型(never 可能用于条件类型,但这是另一个主题),而 undefined 用于变量或参数。 undefined 只是 javascript 类型。 void 用于不返回任何内容的函数,而 never 用于永远不返回的函数(通常在函数总是抛出异常时使用它) - 希望它能澄清它;)
    猜你喜欢
    • 2015-07-04
    • 2023-02-14
    • 2021-09-18
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多