2017-11-21 7 views
0

So in diesem Code finden:Wie kann ich die Namen der Klassen in Module für Typoskript

import * as fs from "fs" 

class FsAsyncFactory { 

    private static fsSync: any 

} 

export default FsAsyncFactory 

Ich habe den Typen dieses prop private static fsSync: any als any setzen, aber es geht um den fs-Variable auf dem zu importierenden top - wie finde ich heraus, wie die Klasse heißt?

Ich vermutete so etwas wie FileSystem, aber es hat nicht funktioniert. Ich habe kein tiefes Verständnis von TypeScript, um es herauszufinden.

Ich habe "@types/node": "^8.0.50", in meinen Dev-Abhängigkeiten und ich bin in node_modules/@types/node/index.d.ts gegangen, aber ich kann nichts sehen, was durchaus Sinn macht? Vielen Dank!

Antwort

1

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.

+0

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! –

+0

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? –

+1

@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. –

Verwandte Themen