[英]Is it OK to cast undefined to void in TS?
function isUndefined (payload: any): payload is undefined | void {
return payload === undefined
}
在 TypeScript 中,我有一個函數可以返回 something 或undefined
或void
。
像一個事件處理程序,可以返回修改后的有效負載,或者開發人員可以選擇不返回任何內容或未定義,以防他們不修改有效負載:
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
。
所以,是的,我們需要對undefined
和void
使用不同的檢查。
我認為你讓這變得更復雜了。 返回void
的函數可以:
return;
沒有指定值的語句。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.