Pengupas tipe JavaScript kecil, cepat, dan murni yang menggunakan parser TypeScript resmi.
TypeScript masuk:
class C < T > extends Array < T > implements I {
// ^^^ ^^^^^^^^^^^^^^^^
private field ! : string ;
// ^^^^^^^ ^^^^^^^^^
method < T > ( this : T , a ?: string ) : void {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
JavaScript + spasi keluar:
class C extends Array {
// ^^^ ^^^^^^^^^^^^^^^^
field ;
// ^^^^^^^ ^^^^^^^^^
method ( a ) {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
Cobalah di taman bermain.
Keunggulan perpustakaan ini adalah:
./perf
untuk tolok ukur mikroSourceFile
, karena objek tersebut dapat digunakan kembali -- dan memproduksi AST adalah bagian yang paling memakan waktu.TypeScript
)Tidak semua sintaksis TypeScript didukung (lihat sintaksis yang tidak didukung). Juga tidak ada penurunan level; JavaScript dipertahankan apa adanya.
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
memperlihatkan kait pemuat modul Node.js yang diperlukan untuk menggunakan ts-blank-space
untuk melakukan pra-proses *.ts
yang diimpor sebelum dievaluasi.
# 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
Selain memuat file *.ts
, penyelesai impor juga terdaftar yang menangkap impor *.js
yang gagal dan mencoba kembali impor dengan mengganti ekstensi dengan .ts
. Hal ini memungkinkan jalur impor untuk memilih .ts
atau .js
bergantung pada faktor lain yang mungkin perlu dipertimbangkan oleh proyek seperti bundling dan distribusi paket.
Pemuat berasumsi bahwa semua file .ts
adalah ESM.
Karena semua JavaScript dalam keluaran terletak pada baris, kolom, dan offset byte yang sama dengan sumber aslinya, tidak ada informasi pemetaan yang hilang selama transformasi.
Ada dua kasus, yang dijelaskan di sini, yang fungsinya lebih dari sekadar mengganti sintaksis TypeScript dengan spasi kosong.
Untuk mencegah masalah ASI pada keluaran, ts-blank-space
akan menambahkan ;
hingga akhir pernyataan tipe saja, dan ketika menghapus anotasi tipe utama dapat menimbulkan bahaya ASI.
statementWithNoSemiColon
type Erased = true
( "not calling above statement" )
menjadi:
statementWithNoSemiColon
;
( "not calling above statement" ) ;
class C {
field = 1 /* no ; */
public [ "computed field not accessing above" ] = 2
}
menjadi:
class C {
field = 1 /* no ; */
; [ "computed field not accessing above" ] = 2
}
Jika anotasi tipe di sekitar parameter fungsi panah memasukkan baris baru, maka hanya menggantinya dengan spasi kosong saja bisa salah. Oleh karena itu, selain menghapus anotasi tipe, (
atau )
yang mengelilingi parameter fungsi juga dapat dipindahkan.
let f = ( a : string , b : string ) : Array <
string
> => [ a , b ] ;
menjadi:
let f = ( a , b
) => [ a , b ] ;
async
dengan argumen tipe multi-baris: let f = async <
T
> ( v : T ) => { } ;
menjadi:
let f = async (
v ) => { } ;
Beberapa bagian TypeScript tidak didukung karena tidak dapat dihapus karena memiliki semantik runtime. Lihat unsupported_syntax.md.
Ketika sintaksis yang tidak didukung ditemukan, ts-blank-space
akan memanggil panggilan balik onError
opsional dan melanjutkan. Contohnya bisa dilihat di errors.test.ts
.
tsconfig.json
yang direkomendasikan {
// 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 ,
}
Masukan .tsx
akan menghasilkan keluaran .jsx
. Bagian BEJ tidak diubah, melainkan disimpan dalam keluaran.
Secara default, ts-blank-space
akan mengurai file dengan asumsi .ts
. Jika file asli berisi sintaks JSX, maka parsing harus dilakukan secara manual. Ada contoh TSX di 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 dapat menambahkan export {};
jika semua import
dan export
telah dihapus (karena import/export type
).
Karena ts-blank-space
hanya menghapus kode, hal ini tidak dilakukan. Untuk memaksa output agar selalu memiliki penanda sintaksis ESM, Anda bisa menambahkan "export {};"
secara manual. ;
Kami ❤️ kontribusi.
Apakah Anda memiliki pengalaman yang baik dengan proyek ini? Mengapa tidak berbagi cinta dan menyumbangkan kode, atau beri tahu kami tentang masalah apa pun yang Anda alami dengannya?
Kami menerima laporan masalah di sini; pastikan untuk memilih templat terbitan yang tepat untuk terbitan Anda, sehingga kami yakin Anda memberikan informasi yang diperlukan.
Sebelum mengirimkan Permintaan Tarik, pastikan Anda membaca Pedoman Kontribusi kami.
Silakan baca file LISENSI.
Proyek ini telah mengadopsi Kode Etik. Jika Anda memiliki kekhawatiran tentang Kode, atau perilaku yang Anda alami dalam proyek ini, silakan hubungi kami di [email protected].
Silakan merujuk ke Kebijakan Keamanan proyek.