javascript - 如何在运行时检查此 TypeScript 代码中的 instanceof?

标签 javascript typescript zeromq

我试图在运行时检查一个变量是否是 ZeroMQ 的 Socket 实例。在 JavaScript 中,这是可行的:

doCheck(input) {
    if (input instanceof zmq.Socket) {
        console.log("Is a socket.");
    }
    else {
        console.log("Is not a socket.");
    }
}

但是在 TypeScript 中,它提示 zmq.Socket,说它还没有从类型定义文件中导出。该文件将 Socket 定义为接口(interface),因此它不是检查它是否为实例的正确类型。我怎样才能使 instanceof 检查工作?

最佳答案

如果 zmq.Socket 被导出为接口(interface),则您不能在此类型上使用 instanceof。您可以在实现中四处乱逛以查看实际实例化了哪个类,但这会很困惑且不可靠。

一个选项是检查对象上是否存在您期望的几种方法,并将其放入类型保护函数中,以便您稍后可以根据需要更改它:

import * as zmq from 'zmq'

function isSocket( sock: any ) : sock is zmq.Socket {
    var castSock = sock as zmq.Socket;
    // If it has all the methods it's probably a zmq.Socket
    return castSock.getsocketopt !== undefined
        && castSock.connect      !== undefined
        && castSock.disconnect   !== undefined
        && castSock.close        !== undefined;
}

function doCheck(input) {
    if (isSocket(input) ) {
        input.close() // input is of a type zmq.Socket
        console.log( "Is a ZeroMQ Socket instance." );
    }
    else {
        console.log( "Is not a ZeroMQ Socket instance." );
    }
}

编辑:

如果 instanceof 代码在纯 JS 中工作,这意味着定义是错误的,Socket 实际上应该是一个类。您可以更正它并将其提交给项目,但同时您可以在您使用的文件中添加以下代码 instanceof:

declare module 'zmq' {
    export class Socket {}
}

function doCheck(input : zmq.Socket | string) {
    if (input instanceof zmq.Socket) {
        input.close() // input is of type zmq.Socket
         console.log( "Is a ZeroMQ Socket instance." );
    }
    else {
        console.log( "Is not a ZeroMQ Socket instance." );
    }
}

关于javascript - 如何在运行时检查此 TypeScript 代码中的 instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47035414/

相关文章:

javascript - 如何重置迭代器?

java - 将 Zeromq 添加到 Github 上的现有 Java Gradle 项目

javascript - 如何在javascript中使用submit()传递数据?

javascript - 通过单击位于模态 - ANGULAR 中的 <ul> 选择选项

javascript - TypeScript 和 Reactjs 中的滚动事件类型是什么

angular - 如何设置构造函数使其没有太多参数?

python - ZMQ连接和推送-如何确定是否失败

python - 如何使用 zeromq 和线程或异步处理对 python 程序的多个请求?

javascript - 添加图像以响应动态链接

javascript - 无法绑定(bind)到,因为它不是选择器组件的已知属性