Ein kleiner, schneller, reiner JavaScript-Type-Stripper, der den offiziellen TypeScript-Parser verwendet.
TypeScript geht hinein:
class C < T > extends Array < T > implements I {
// ^^^ ^^^^^^^^^^^^^^^^
private field ! : string ;
// ^^^^^^^ ^^^^^^^^^
method < T > ( this : T , a ?: string ) : void {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
Es kommt JavaScript + Leerzeichen heraus:
class C extends Array {
// ^^^ ^^^^^^^^^^^^^^^^
field ;
// ^^^^^^^ ^^^^^^^^^
method ( a ) {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
Probieren Sie es auf dem Spielplatz aus.
Die Vorteile dieser Bibliothek sind:
./perf
SourceFile
Objekt generiert, da es wiederverwendet werden kann – und die Erstellung des AST der zeitaufwändigste Teil ist.TypeScript
)Nicht die gesamte TypeScript-Syntax wird unterstützt (siehe nicht unterstützte Syntax). Es erfolgt auch kein Downleveling; Das JavaScript bleibt unverändert erhalten.
npm install ts-blank-space
export default function tsBlankSpace ( ts : string , onError ?: ( node ) => void ) : string ;
import tsBlankSpace from "ts-blank-space" ;
console . log ( tsBlankSpace ( `let x: string;` ) ) ;
// "let x ;"
export function blankSourceFile ( ts : typescript . SourceFile , onError ?: ( node ) => void ) : string ;
import ts from "typescript" ;
import { blankSourceFile } from "ts-blank-space" ;
const ast = ts . createSourceFile ( ... ) ;
console . log ( blankSourceFile ( ast ) ) ;
ts-blank-space
stellt die erforderlichen Node.js-Modullade-Hooks bereit, um ts-blank-space
importierte *.ts
vorzuverarbeiten, bevor sie ausgewertet werden.
# Install (one time):
$ npm install --save-dev ts-blank-space
# Example usage (Node.js >= v18.20):
$ node --import ts-blank-space/register ./path/to/your/file.ts
Zusätzlich zum Laden von *.ts
Dateien ist auch ein Import-Resolver registriert, der fehlgeschlagene *.js
Importe abfängt und den Import erneut versucht, wobei die Erweiterung durch .ts
ersetzt wird. Dadurch können Importpfade entweder .ts
oder .js
wählen, je nachdem, welche anderen Faktoren das Projekt möglicherweise berücksichtigen muss, wie z. B. Bündelung und Paketverteilung.
Der Loader geht davon aus, dass alle .ts
Dateien ESM sind.
Da sich das gesamte JavaScript in der Ausgabe in derselben Zeile, Spalte und demselben Byte-Offset wie die Originalquelle befindet, gehen während der Transformation keine Zuordnungsinformationen verloren.
Es gibt zwei hier beschriebene Fälle, in denen mehr als nur die TypeScript-Syntax durch Leerzeichen ersetzt wird.
Um ASI-Probleme in der Ausgabe zu vermeiden, fügt ts-blank-space
;
bis zum Ende von Nur-Typ-Anweisungen und wenn eine führende Typanmerkung entfernt wird, kann dies zu einer ASI-Gefahr führen.
statementWithNoSemiColon
type Erased = true
( "not calling above statement" )
wird:
statementWithNoSemiColon
;
( "not calling above statement" ) ;
class C {
field = 1 /* no ; */
public [ "computed field not accessing above" ] = 2
}
wird:
class C {
field = 1 /* no ; */
; [ "computed field not accessing above" ] = 2
}
Wenn die Typanmerkungen rund um die Parameter einer Pfeilfunktion eine neue Zeile einführen, kann es falsch sein, sie nur durch Leerzeichen zu ersetzen. Daher kann zusätzlich zum Entfernen der Typanmerkung auch das die Funktionsparameter umgebende (
oder )
verschoben werden.
let f = ( a : string , b : string ) : Array <
string
> => [ a , b ] ;
wird:
let f = ( a , b
) => [ a , b ] ;
async
mit mehrzeiligen Typargumenten: let f = async <
T
> ( v : T ) => { } ;
wird:
let f = async (
v ) => { } ;
Einige Teile von TypeScript werden nicht unterstützt, da sie aufgrund der Laufzeitsemantik nicht direkt gelöscht werden können. Siehe unsupported_syntax.md.
Wenn eine nicht unterstützte Syntax auftritt, ruft ts-blank-space
den optionalen onError
Rückruf auf und fährt fort. Beispiele finden Sie in errors.test.ts
.
tsconfig.json
Compilereinstellungen {
// Because JS syntax is emitted as-is
"target" : "esnext" ,
// Because class fields are preserved as written which corresponds
// to 'define' semantics in the ECMAScript specification
"useDefineForClassFields" : true ,
// Because imports and exports are preserved as written, only removing the
// parts which are explicitly annotated with the `type` keyword
"verbatimModuleSyntax" : true ,
}
.tsx
Eingabe generiert .jsx
Ausgabe. JSX-Teile werden nicht transformiert, sondern in der Ausgabe beibehalten.
Standardmäßig analysiert ts-blank-space
die Datei unter der Annahme .ts
. Wenn die Originaldatei JSX-Syntax enthält, sollte die Analyse manuell erfolgen. Es gibt ein TSX-Beispiel in valid.test.ts
.
import ts from "typescript" ;
import { blankSourceFile } from "ts-blank-space" ;
...
const tsxSource = ts . createSourceFile ( "input.tsx" , tsxInput , ts . ScriptTarget . ESNext , false , ts . ScriptKind . TSX ) ;
const jsxOutput = blankSourceFile ( tsxSource , onError ) ;
TypeScript fügt möglicherweise einen export {};
wenn alle import
s und export
s entfernt wurden (weil es sich um import/export type
handelte).
Da ts-blank-space
nur Code entfernt, wird dies nicht durchgeführt. Um zu erzwingen, dass die Ausgabe immer eine ESM-Syntaxmarkierung enthält, können Sie "export {};"
manuell anhängen. ;
Wir ❤️ Beiträge.
Haben Sie gute Erfahrungen mit diesem Projekt gemacht? Warum teilen Sie uns nicht etwas Liebe mit und tragen Code bei, oder lassen Sie uns einfach wissen, welche Probleme Sie damit hatten?
Wir freuen uns hier über Problemmeldungen; Stellen Sie sicher, dass Sie die richtige Problemvorlage für Ihr Problem auswählen, damit wir sicher sein können, dass Sie die erforderlichen Informationen bereitstellen.
Bevor Sie eine Pull-Anfrage senden, lesen Sie bitte unbedingt unsere Beitragsrichtlinien.
Bitte lesen Sie die LIZENZ-Datei.
Dieses Projekt hat einen Verhaltenskodex verabschiedet. Wenn Sie Bedenken bezüglich des Kodex oder Verhaltensweisen haben, die Sie im Projekt erlebt haben, kontaktieren Sie uns bitte unter [email protected].
Bitte beachten Sie die Sicherheitsrichtlinie des Projekts.