Node-ipc в классе Typescript - PullRequest
       29

Node-ipc в классе Typescript

0 голосов
/ 07 февраля 2019

Я пытаюсь использовать 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 классане так ли?

1 Ответ

0 голосов
/ 07 февраля 2019

Из содержимого index.d.ts узла-ipc нельзя напрямую использовать класс имен 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

Обновление:

Я только что обнаружил, что в 2.8+ TypeScripts входит предопределенный условный тип InstanceType<T>, который делает то же самое, что и InferType<T>из моего кода выше.Так что на самом деле, используйте его напрямую, и у нас есть еще более короткое решение:

class IpcImpl {

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...