typescript - Hur man starkt typar resultatet av electron.remote.require()
I rendererprocessen för en Electron-applikation utvecklad med Typescript har jag till exempel:
import {remote} from 'electron';
const Fs = remote.require('fs');
där Fs är av typen any
Jag skulle vilja att Fs är av typen "module:fs" men jag vet inte hur man uppnår detta i Typescript:
const Fs = remote.require('fs') // as module:fs ??
Någon idé?
Svar #1
Du kan göra detta med modulförstärkning.
Skapa en fil, till exempel augmentations.d.ts och specificera dess innehåll enligt följande
// 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;
}
}
Detta utökar deklarationen av electrons Remote-gränssnitt genom att lägga till en överlagring av require som associerar strängliteraltypen "fs" med typen för standardexporten från NodeJS:s "fs"-modul som deklarerats av @types/node och installerats som ett beroende till election.
Svar #2
Jag är inte säker på vad module:fs är, men så länge du är mycket säker på att strukturen för båda matchar kan du använda typbekräftelse med as.
Om du är osäker, se då om du kan ha något som nedan: (Observera att detta kan behöva några justeringar och jag har inte testat detta)
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()
