It is possible to specify void as a type parameter for generic function in TypeScript. And it works fine for return values of functions. However when void is a type of an argument it's not that clear what value can be used for it. Is there a way to specify a parameter for an argument of the void type? If no, why is it possible to declare such a function?
From the TypeScript specification:
NOTE: We might consider disallowing declaring variables of type Void as they serve no useful purpose. However, because Void is permitted as a type argument to a generic type or function it is not feasible to disallow Void properties or parameters.
It is possible to use void as a type argument, but you shouldn't use it as a type.
In fact, although you may be able to use it in a type annotation currently, it is impossible to assign a value:
var x: void = ???; // cannot supply a value
The use of void as a type argument is illustrated below:
class Example<TReturn> {
process(func: () => TReturn) {
return func();
}
}
The type argument in this class is used to specify the return type of a function. That means that I may wish to specify that the function will have the void type. So it must be allowed as a type argument.
var example = new Example<void>();
Now when I write the call to example.process, auto-completion will tell me that the argument I pass needs to satisfy the following type:
func: () => void
And it will also tell me that example.process itself is void in this case.
The intention isn't for void to ever be used to annotate a type, but because there are valid reasons to allow it as a type argument it isn't checked currently. It means you can create something invalid, but you'd be hard pressed to use it:
class Example<T> {
process(func: T) {
// if T is void, this is all wrong
}
}
var example = new Example<void>();
In this invalid example (which doesn't show any errors) you wouldn't be able to write a call to example.process because you couldn't pass a valid argument.
A useful use for void is when you want to make a parameter optional. Angular uses this a lot with RxJS Subject<T> when emitting events and there's no useful type for the event.
The signature for Subject<T>'s next function is :
next(value?: T)
You can create a Subject<void> which makes the value parameter forbidden:
new Subject<void>().next() // ok
new Subject<void>().next(true) // not allowed
as opposed to non-void where you get
new Subject<boolean>().next(true)
Not sure exactly which TS version this became possible.
It turned out it's very easy to get a value of void. Although technically it is still the undefined value, but TypeScript believes it's of the type void which is exactly what we need:
var voidValue = (function () { })();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With