簡體   English   中英

void 作為 TypeScript 中泛型函數的參數類型

[英]void as a type of an argument of a generic function in TypeScript

可以將void指定為 TypeScript 中泛型函數的類型參數。 它適用於函數的返回值。 然而,當void是一種參數時,它並不清楚可以使用什么值。 有沒有辦法為void類型的參數指定參數? 如果不是,為什么可以聲明這樣的函數?

打字稿規范

注意:我們可能會考慮禁止聲明 Void 類型的變量,因為它們沒有任何用處。 但是,因為 Void 被允許作為泛型類型或函數的類型參數,所以禁止 Void 屬性或參數是不可行的。

可以將void用作類型參數,但不應將其用作類型。

實際上,盡管您目前可以在類型注釋中使用它,但無法賦值:

var x: void = ???; // cannot supply a value

void 作為類型參數的使用如下所示:

class Example<TReturn> {
    process(func: () => TReturn) {
        return func();
    }
}

此類中的類型參數用於指定函數的返回類型。 這意味着我可能希望指定該函數將具有void類型。 所以它必須被允許作為類型參數。

var example = new Example<void>();

現在,當我編寫對example.process的調用時,自動完成會告訴我我傳遞的參數需要滿足以下類型:

func: () => void

它還會告訴我在這種情況下example.process本身是無效的。

目的不是讓void永遠用於注釋類型,而是因為有正當理由允許它作為類型參數,所以當前不檢查它。 這意味着你可以創建一些無效的東西,但你很難使用它:

class Example<T> {
    process(func: T) {
        // if T is void, this is all wrong
    }
}

var example = new Example<void>();

在這個無效的例子(它沒有顯示任何錯誤)中,你將無法編寫對example.process的調用,因為你不能傳遞一個有效的參數。

void一個有用用途是當您想將參數設為可選時。 Angular 在發出事件時經常將它與 RxJS Subject<T> ,並且該事件沒有有用的類型。

Subject<T>next函數的簽名是:

next(value?: T)

您可以創建一個Subject<void>來禁止value參數:

new Subject<void>().next() // 好的

new Subject<void>().next(true) // 不允許

而不是你得到的非無效

new Subject<boolean>().next(true)

不確定這到底是哪個 TS 版本成為可能。

結果證明很容易得到一個 void 值。 雖然從技術上講它仍然是undefined值,但 TypeScript 認為它是 void 類型,這正是我們需要的:

var voidValue = (function () { })();

你可以這樣做:

class Example<T> {
    process(func: T = undefined) {
    // use default undefined parameter
    }
}

var example = new Example<void>();

exmple.process();

我正在使用 Typescript 1.8.7,它對我很好。

您可以將undefinedvoid

const x: void = undefined as void

就像@c-snover 所說的, void幾乎沒有任何用處,但它被允許作為函數參數類型或作為泛型類型 T 的類型參數,因此不能從規范中刪除。

TLDR ⇒聲明一個function(v: void)就像說v不存在。 您可以雖然return d ,這等效於return ,但您不能將任何類型的任何值傳遞給該函數參數(好吧,除了void|undefined類型的變量和值undefined )。

在泛型類型參數的情況下,在實例化時,同樣的規則適用。 如果T在實例化時被傳遞為void ,則無論在該類中使用類型T任何地方,它都會被void替換,因此上述內容再次適用。


在功能上, voidundefined相同,除了在某些情況下它是隱式的,例如在沒有返回任何內容時的函數返回。

undefined僅與可選函數參數(例如function(variable?: number)隱式使用,其中variable的類型實際上變為number|undefined 。如果參數在函數調用中沒有傳遞任何值,則它是隱式undefined

相比之下, function(variable: number|undefined)的聲明意味着該參數現在是強制性的,並且需要顯式傳遞一個值,包括顯式傳遞undefined ,如果這是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM