Sie können den Befehl "type of" von typescript verwenden.
import * as fs from "fs"
class FsAsyncFactory {
private static fsSync: typeof fs
}
export default FsAsyncFactory
Und dann in Ihrer Klasse
constructor(){
//...//
FsAsyncFactory.fsSync. //ide recognizes fsSync is of type "fs" and gives you full prediction of fs functions
//...//
}
Frage: Was typeof ist und warum kann ich nur Klassennamen?
Grundsätzlich verstehe ich durch das Lesen der node/index.d.ts
die fs
ist nur ein Modul, das exportiert wird. Grundsätzlich ein Objekt mit einigen typisierten Funktionen mit eigener Dokumentation. In diesem Fall haben wir keinen Klassennamen oder eine Schnittstelle, um unsere anderen Variablen zu deklarieren, die gleich fs
sind. Der typeof
Befehl von typescript ist eine Abfrage, im Grunde, wenn keine Klasse oder Schnittstelle auf der Quellvariable implementiert ist, wird erwartet, dass die gleichen Eigenschaften der Quelle im Ziel dargestellt werden.
Ein anderer Ansatz mit Ihrem Problem könnte die Verwendung von Typ Aliases sein
import * as fs from "fs"
type FileSystem = typeof fs
class FsAsyncFactory {
private static fsSync: FileSystem
}
export default FsAsyncFactory
Dieses eine neue Art FileSystem
genannt schaffen, die jedes Objekt erwarten, die als FileSystem
Typ deklariert wird, jede Funktion zu implementieren das fs
Modul.
Frage: Wie kann ich PromisifyAll von Bluebird mit Typoskript verwenden?
import * as fs from "fs"
import * as Bluebird from "bluebird"
const fsProm : FileSystem = Bluebird.promisifyAll(fs)
fsProm.writeFile('filename','some data') // Typescript error function expects at least 3 parameters
.then(console.log)
Leider aus meiner Sicht promisifyAll wird eine strenge typisierte Funktion etwas anderes ändern, ohne Definitionen zu verlassen, was sich verändert, das heißt für Typoskript sehr schlecht. Nach einiger Suche konnte ich keine feste Lösung finden, die in allen Fällen funktioniert, überprüfen Sie diese issue. Vielleicht ist Ihre beste Wette, Ihre promisidied-Variable zu Typ any
zu deklarieren und weiter ohne Intellisense zu arbeiten.
Das funktioniert dank! Noch eine Sache - kannst du erklären, warum ich typeof anstelle eines Klassennamens verwenden muss, wie ich es mit meinen eigenen Klassendefinitionen tun würde? Nur so weiß ich für zukünftige Referenz. Vielen Dank! –
Auch ich benutze eigentlich bluebird zu 'promisifyAll', so dass TypeScript Kompilierung auf den aufrufenden Code fehlschlägt, da' readFileAsync' nicht Teil der Definition von 'fs' ist - irgendwelche Ideen, wie man das beheben kann? –
@ForceHero überprüfen Sie die aktualisierte Antwort, ich konnte nicht alle Antworten in Ihren Fragen finden, aber vielleicht werde ich Sie in eine Richtung weisen. –