繁体   English   中英

在 TS 中将 undefined 转换为 void 可以吗?

[英]Is it OK to cast undefined to void in TS?

TLDR;

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

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

语境

在 TypeScript 中,我有一个函数可以返回 something 或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不是undefined void表示没有返回值。 undefined是运行时 undefined 值的类型。

在运行时不返回任何值的函数确实会返回undefined ,但在 TS 类型系统中,我们选择使没有返回值的情况变得特殊。

例如将(a) => void to (a) => number | undefined分配(a) => void to (a) => number | undefined (a) => void to (a) => number | undefined可能是一个错误,尽管它在运行时是安全的。

除了函数的返回类型外,一般不要使用 void。 对于其他所有内容,请使用undefined

所以,是的,我们需要对undefinedvoid使用不同的检查。

我认为你让这变得更复杂了。 返回void的函数可以:

  1. 没有返回声明
  2. return; 没有指定值的语句。
  3. 有一个return undefined;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)
}

操场

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM