#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()