gpt4 book ai didi

javascript - 可以在 TS 中将 undefined 强制转换为 void 吗?

转载 作者:行者123 更新时间:2023-12-03 22:43:46 25 4
gpt4 key购买 nike

TLDR;

这个可以吗?或者这是不好的做法?

function isUndefined (payload: any): payload is undefined | void {
return payload === undefined
}

语境

在 TypeScript 中,我有一个函数可以返回一些东西或 undefinedvoid .

诸如可以返回修改后的有效负载的事件处理程序之类的东西,或者开发人员可以选择不返回任何内容或未定义,以防他们不会修改有效负载:
function eventHandler <T extends {[key: string]: any}> (payload: T): Modified<T> | undefined | void {
// ... implementation
}

然后我有一个类型检查器,它需要检查它是否返回除了 void 或 undefined 以外的东西:
const result = eventHandler(payload)

if (result !== undefined) {
// we have a modified payload!
}

但是,上面的代码片段是不是我得到了一个错误,因为它说即使 result !== undefined仍然可以是 void ?

在我看来,我认为这很奇怪,因为 void应与 undefined 相同.

所以我做了这个类型检查器来解决它:
function isUndefined (payload: any): payload is undefined | void {
return payload === undefined
}

这解决了我的问题,但我的问题是:

这个可以吗?或者这是不好的做法?

最佳答案

我认为您正在使事情变得更加复杂。返回 void 的函数能够:

  • 无退货声明
  • 有一个return;没有指定值的语句。
  • 有一个return undefined;陈述。

  • 在纯 javascript 中,以上所有内容的返回值为 undefined .如果你说一个函数返回 undefined ,那么您只能从上面的列表中执行#2 和#3。

    所以你可以有一个联合 void 的函数类型随心所欲。
    function foo(): string | void {
    return Math.random() > 0.5 ? 'abc' : 123
    }

    const val = foo()
    if (val === undefined) {
    console.log('is undefined', val)
    } else {
    console.log('is some value', val)
    }

    这意味着您可以创建一个通用函数类型来修改有效负载,如下所示:
    type PayloadModifier<T extends {[key: string]: any}> = (payload: T) => T | void

    const setMaxAsTen: PayloadModifier<{a: number}> = (payload) => {
    if (payload.a > 10) {
    return { a: 10 }
    }
    return undefined // required unless noImplicitReturns is false
    }

    const val = setMaxAsTen({a: 5})
    if (val === undefined) {
    console.log('is undefined', val)
    } else {
    console.log('is some value', val)
    }

    Playground

    最后要注意的是,有一个编译器选项可以保留在 called noImplicitReturns 上。 .如果函数在任何执行分支中声明返回值,则必须在每个执行分支中声明返回值。所以因为上面有时会返回一个值,所以必须显式返回 undefined如果您不返回有效负载。您可以关闭该选项,允许您省略该行,但不建议这样做,因为它确实可以帮助您捕获一些错误。

    关于javascript - 可以在 TS 中将 undefined 强制转换为 void 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60700656/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com