3

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

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?: IPC
  • ipc?: typeof IPC

如何指定我的ipc班级成员的类型?

4

1 回答 1

3

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

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();
    }

}
于 2019-02-07T14:31:11.193 回答