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

Tri*_*Gao 9 typescript

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

C S*_*ver 9

TypeScript规范:

注意:我们可能会考虑不允许声明Void类型的变量,因为它们没有用处.但是,由于允许Void作为泛型类型或函数的类型参数,因此禁止Void属性或参数是不可行的.


flu*_*nic 7

您可以投射undefinedvoid

const x: void = undefined as void
Run Code Online (Sandbox Code Playgroud)

  • 当我传递“未定义”时,它无需强制转换即可对我起作用。 (3认同)

Fen*_*ton 6

可以void用作类型参数,但不应将其用作类型。

实际上,尽管您目前可以在类型注释中使用它,但无法赋值:

var x: void = ???; // cannot supply a value
Run Code Online (Sandbox Code Playgroud)

void 作为类型参数的使用如下所示:

class Example<TReturn> {
    process(func: () => TReturn) {
        return func();
    }
}
Run Code Online (Sandbox Code Playgroud)

此类中的类型参数用于指定函数的返回类型。这意味着我可能希望指定函数将具有void类型。所以它必须被允许作为类型参数。

var example = new Example<void>();
Run Code Online (Sandbox Code Playgroud)

现在,当我编写对 的调用时example.process,自动完成会告诉我我传递的参数需要满足以下类型:

func: () => void
Run Code Online (Sandbox Code Playgroud)

它还会告诉我在这种情况下example.process本身是无效的。

目的不是void永远用于注释类型,而是因为有充分的理由允许它作为类型参数,所以当前不检查它。这意味着你可以创建一些无效的东西,但你很难使用它:

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

var example = new Example<void>();
Run Code Online (Sandbox Code Playgroud)

在这个无效示例(没有显示任何错误)中,您将无法写入调用,example.process因为您无法传递有效参数。


Tri*_*Gao 5

事实证明,很容易获得 void 值。虽然从技术上讲它仍然是undefined值,但 TypeScript 认为它是 void 类型,这正是我们需要的:

var voidValue = (function () { })();
Run Code Online (Sandbox Code Playgroud)

  • 这个已经很老了,但是在最新的打字稿版本中,你可以只使用“var voidValue: void = undefined;” (4认同)

Sim*_*ver 5

一个有用的用途void是当您想要将参数设为可选时。角使用这个很多与RxJSSubject<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 版本成为可能。