我试图在运行时检查一个变量是否是 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/