簡體   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