void作为TypeScript中泛型函数的一种参数

时间:2014-01-14 18:00:00

标签: typescript

可以将void指定为TypeScript中泛型函数的类型参数。它适用于函数的返回值。但是,当void是一种参数时,它不清楚可以使用什么值。有没有办法为void类型的参数指定参数?如果不是,为什么可以声明这样的函数?

7 个答案:

答案 0 :(得分:8)

来自TypeScript specification

  

注意:我们可能会考虑不允许声明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替代,因此以上内容同样适用。


在功能上,voidundefined相同,除了在某些情况下它是隐式的(例如在不返回任何内容的情况下在函数返回中)。

undefined仅与可选函数参数一起隐式使用(例如function(variable?: number),其中variable的类型实际上变为number|undefined。如果未传递任何参数,函数调用中的值,它隐式为undefined

相反,声明function(variable: number|undefined)意味着该参数现在是强制性的,并且如果需要的话,需要显式传递一个值,包括显式传递undefined

答案 6 :(得分:0)

您可以将undefined投射到void

const x: void = undefined as void