Как строго ввести результат electron.remote.require()

#typescript #electron #typescript-typings

#typescript #electron #typescript-типизации

Вопрос:

В процессе визуализации приложения electron, разработанного с помощью Typescript, у меня есть, например:

 import {remote} from 'electron';
const Fs = remote.require('fs');
  

где Fs имеет тип any

Я хотел бы Fs иметь тип «module: fs», но я не знаю, как добиться этого в Typescript:

 const Fs = remote.require('fs') // as module:fs ??
  

Есть идеи?

Ответ №1:

Вы можете сделать это с помощью расширения модуля.

Создайте файл, скажем augmentations.d.ts , и укажите его содержимое следующим образом

 // Augmentations are only valid in modules.
// This ensures this file is parsed as a module.
export {} 

import fs from 'fs';

declare module 'electron' {
  interface Remote {
    require(moduleSpecifier: 'fs'): typeof fs;
  }
}
  

Это увеличивает объявление Remote интерфейса electron, добавляя перегрузку require , которая связывает тип строкового литерала "fs" с типом экспорта по умолчанию "fs" модуля NodeJS, объявленного @types/node и установленного как зависимость от election .

Комментарии:

1. Идеально! Это работает как шарм: remote.require('fs') больше не работает с этим объявлением среды

Ответ №2:

Я не уверен в том, что module:fs есть, но до тех пор, пока вы уверены, что структура обоих совпадает, вы можете использовать утверждение типа с помощью as .

Если вы не уверены, то посмотрите, может ли у вас быть что-то вроде приведенного ниже: (Обратите внимание, что это может потребовать некоторой настройки, и я не тестировал это)

 function isFs(obj: any): pet is module:fs {
  return (obj as module:fs).xxx !== undefined;
}


const getFs = () => {
 const fs = remote.require('fs')
 if(isFs(fs)) return fs
 else throw TypeError(`remote.require('fs') can not be cast to module:fs`)
}

const Fs = getFs()