Typescript 中的 Node-ipc class

Node-ipc in Typescript class

我正在尝试在我的 TypeScript 项目中使用 node-ipc,并坚持为 class 成员获取正确的类型:

import { IPC } from 'node-ipc';

class IpcImpl extends IIpc {
    ipcSocketPath?: string;
    ipc?: any;  // What the type should be here?


    setupIpc(ipcSocketPath: string) {
        this.ipcSocketPath = ipcSocketPath;
        this.ipc = new IPC();  // Here instantiated ok, but type mismatch ed

    }

我当然安装了 @types/node-ipc 但它对我没有帮助。我试图指定以下内容(一切都不正确):

如何指定我的 ipc class 会员权限类型?

从 node-ipc 的 index.d.ts 内容中,您不能直接使用 NodeIPC 命名空间或 NodeIPC.IPC class,因为它们未导出:

declare namespace NodeIPC {
    class IPC {
        // Some methods
    }
    // Some other classes
}

declare const RootIPC: NodeIPC.IPC & { IPC: new () => NodeIPC.IPC };

export = RootIPC;

但是,如果您使用的是 TypeScript 2.8+,由于 条件类型类型推断 在你的案例中使用:

type InferType<T> = T extends new () => infer U ? U : undefined;

因此您可以获得 NodeIPC.IPC 类型:

import { IPC } from 'node-ipc';

type InferType<T> = T extends new () => infer U ? U : undefined;

class IpcImpl {

    ipcSocketPath?: string;
    ipc?: InferType<typeof IPC>;

    setupIpc(ipcSocketPath: string) {
        this.ipcSocketPath = ipcSocketPath;
        this.ipc = new IPC();
    }

}

您可以在 TypeScript 2.8 发行说明中找到一些有关条件类型和类型推断的有趣信息: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

更新:

我刚刚发现 TypeScripts 的 2.8+ 包含 InstanceType<T> 预定义条件类型,它与我上面代码中的 InferType<T> 做的事情完全相同。 所以实际上,直接使用它,我们有一个更短的解决方案:

class IpcImpl {

    ipcSocketPath?: string;
    ipc?: InstanceType<typeof IPC>;

    setupIpc(ipcSocketPath: string) {
        this.ipcSocketPath = ipcSocketPath;
        this.ipc = new IPC();
    }

}