可以将void
指定为TypeScript中泛型函数的类型参数。它适用于函数的返回值。但是,当void
是一种参数时,它不清楚可以使用什么值。有没有办法为void
类型的参数指定参数?如果不是,为什么可以声明这样的函数?
答案 0 :(得分:8)
注意:我们可能会考虑不允许声明Void类型的变量,因为它们没有用处。但是,由于允许Void作为泛型类型或函数的类型参数,因此禁止使用Void属性或参数是不可行的。
答案 1 :(得分:4)
可以使用void
作为类型参数,但不应将其用作类型。
实际上,虽然您当前可以在类型注释中使用它,但是无法分配值:
var x: void = ???; // cannot supply a value
使用void作为类型参数如下所示:
class Example<TReturn> {
process(func: () => TReturn) {
return func();
}
}
此类中的type参数用于指定函数的返回类型。这意味着我可能希望指定该函数将具有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
的调用,因为您无法传递有效参数。
答案 2 :(得分:1)
事实证明,获得虚拟价值非常容易。虽然从技术上来说它仍然是undefined
值,但是TypeScript认为它属于void类型,这正是我们所需要的:
var voidValue = (function () { })();
答案 3 :(得分:1)
您可以这样做:
class Example<T> {
process(func: T = undefined) {
// use default undefined parameter
}
}
var example = new Example<void>();
exmple.process();
我正在使用Typescript 1.8.7,它对我很有用。
答案 4 :(得分:0)
void
的有用用法是当您要将参数设为可选时。发射事件时,RxJS Subject<T>
的角度uses this很大,事件没有有用的类型。
Subject<T>
的{{1}}函数的签名是:
next
您可以创建一个next(value?: T)
来禁止使用Subject<void>
参数:
value
//好的
new Subject<void>().next()
//不允许
而不是非虚无之物
new Subject<void>().next(true)
不确定到底可以使用哪个TS版本。
答案 5 :(得分:0)
就像@ c-snover所说的,void
几乎没有用处,但可以作为函数参数类型或泛型T的 type参数来使用>,因此无法将其从规格中删除。
TLDR⇒声明function(v: void)
就像说v
不存在。尽管可以使用return d
,它仅相当于return
,但是您不能将任何类型的任何值传递给该函数参数(当然,除了类型为void|undefined
的变量和value undefined
。
对于泛型类型参数,在实例化时,将应用相同的规则。如果在实例化时将T
传递给void
,则无论在该类中使用哪种类型的T
,它都将被void
替代,因此以上内容同样适用。
在功能上,void
与undefined
相同,除了在某些情况下它是隐式的(例如在不返回任何内容的情况下在函数返回中)。
undefined
仅与可选函数参数一起隐式使用(例如function(variable?: number)
,其中variable
的类型实际上变为number|undefined
。如果未传递任何参数,函数调用中的值,它隐式为undefined
。
相反,声明function(variable: number|undefined)
意味着该参数现在是强制性的,并且如果需要的话,需要显式传递一个值,包括显式传递undefined
。
答案 6 :(得分:0)
您可以将undefined
投射到void
:
const x: void = undefined as void