ตัวเปลื้องประเภท JavaScript ขนาดเล็ก รวดเร็ว และบริสุทธิ์ที่ใช้ตัวแยกวิเคราะห์ TypeScript อย่างเป็นทางการ
TypeScript เข้าไปอยู่ใน:
class C < T > extends Array < T > implements I {
// ^^^ ^^^^^^^^^^^^^^^^
private field ! : string ;
// ^^^^^^^ ^^^^^^^^^
method < T > ( this : T , a ?: string ) : void {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
JavaScript + space ออกมา:
class C extends Array {
// ^^^ ^^^^^^^^^^^^^^^^
field ;
// ^^^^^^^ ^^^^^^^^^
method ( a ) {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
ลองเล่นในสนามเด็กเล่นดูสิ
ประโยชน์ของห้องสมุดนี้คือ:
./perf
สำหรับการวัดประสิทธิภาพแบบไมโครSourceFile
อยู่แล้ว เนื่องจากสามารถนำกลับมาใช้ใหม่ได้ และการสร้าง AST นั้นเป็นส่วนที่ใช้เวลานานที่สุดTypeScript
)รองรับไวยากรณ์ TypeScript บางส่วนเท่านั้น (ดูไวยากรณ์ที่ไม่รองรับ) นอกจากนี้ยังไม่มีการปรับระดับลง JavaScript จะถูกเก็บรักษาไว้ตามที่เป็นอยู่
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
แสดง hook ตัวโหลดโมดูล Node.js ที่จำเป็นเพื่อใช้ ts-blank-space
เพื่อประมวลผลล่วงหน้า *.ts
ที่นำเข้าก่อนที่จะได้รับการประเมิน
# 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
นอกเหนือจากการโหลดไฟล์ *.ts
แล้ว ตัวแก้ไขการนำเข้ายังได้รับการลงทะเบียนด้วย ซึ่งการตรวจจับล้มเหลวในการนำเข้า *.js
และพยายามนำเข้าอีกครั้งโดยแทนที่ส่วนขยายด้วย .ts
ซึ่งช่วยให้เส้นทางการนำเข้าสามารถเลือก .ts
หรือ .js
ได้ ขึ้นอยู่กับปัจจัยอื่นๆ ที่โปรเจ็กต์อาจต้องคำนึงถึง เช่น การรวมกลุ่มและการแจกจ่ายแพ็คเกจ
ตัวโหลดจะถือว่าไฟล์ .ts
ทั้งหมดเป็น ESM
เนื่องจาก JavaScript ทั้งหมดในเอาต์พุตจะอยู่ที่บรรทัด คอลัมน์ และไบต์ออฟเซ็ตเดียวกันกับต้นฉบับ ข้อมูลการแมปจึงไม่สูญหายระหว่างการแปลง
มีสองกรณีที่อธิบายไว้ที่นี่ โดยแทนที่ไวยากรณ์ TypeScript ด้วยช่องว่าง
เพื่อป้องกันปัญหา ASI ในเอาต์พุต ts-blank-space
จะเพิ่ม ;
ต่อท้ายข้อความสั่งประเภทเท่านั้น และเมื่อลบคำอธิบายประกอบประเภทนำหน้าออกอาจทำให้เกิดอันตรายจาก ASI ได้
statementWithNoSemiColon
type Erased = true
( "not calling above statement" )
กลายเป็น:
statementWithNoSemiColon
;
( "not calling above statement" ) ;
class C {
field = 1 /* no ; */
public [ "computed field not accessing above" ] = 2
}
กลายเป็น:
class C {
field = 1 /* no ; */
; [ "computed field not accessing above" ] = 2
}
หากคำอธิบายประกอบประเภทรอบๆ พารามิเตอร์ของฟังก์ชันลูกศรทำให้เกิดการขึ้นบรรทัดใหม่ การแทนที่ด้วยช่องว่างเท่านั้นจึงจะไม่ถูกต้องได้ ดังนั้น นอกเหนือจากการลบคำอธิบายประกอบประเภทแล้ว (
หรือ )
ที่อยู่รอบๆ พารามิเตอร์ฟังก์ชันก็อาจถูกย้ายด้วย
let f = ( a : string , b : string ) : Array <
string
> => [ a , b ] ;
กลายเป็น:
let f = ( a , b
) => [ a , b ] ;
async
พร้อมอาร์กิวเมนต์ประเภทหลายบรรทัด: let f = async <
T
> ( v : T ) => { } ;
กลายเป็น:
let f = async (
v ) => { } ;
ไม่รองรับบางส่วนของ TypeScript เนื่องจากไม่สามารถลบออกได้เนื่องจากมีความหมายรันไทม์ ดูunsupported_syntax.md
เมื่อพบไวยากรณ์ที่ไม่รองรับ ts-blank-space
จะเรียกตัวเลือกเรียกกลับ onError
และดำเนินการต่อ ตัวอย่างสามารถดูได้ใน errors.test.ts
tsconfig.json
ที่แนะนำ {
// 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
จะสร้างเอาต์พุต .jsx
ส่วน JSX จะไม่ถูกแปลง แต่จะถูกเก็บไว้ในเอาต์พุตแทน
ตามค่าเริ่มต้น ts-blank-space
จะแยกวิเคราะห์ไฟล์โดยถือว่า . .ts
หากไฟล์ต้นฉบับมีไวยากรณ์ JSX การแยกวิเคราะห์ควรทำด้วยตนเอง มีตัวอย่าง TSX ใน 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 อาจเพิ่ม export {};
หาก import
และ export
ทั้งหมดถูกลบออก (เนื่องจากเป็น import/export type
)
เนื่องจาก ts-blank-space
จะลบเฉพาะโค้ดเท่านั้น จึงไม่ดำเนินการนี้ หากต้องการบังคับให้เอาต์พุตมีเครื่องหมายวากยสัมพันธ์ ESM เสมอ คุณสามารถต่อท้าย "export {};"
ได้ด้วยตนเอง -
เรา❤️มีส่วนร่วม
คุณเคยมีประสบการณ์ที่ดีกับโครงการนี้หรือไม่? ทำไมไม่แบ่งปันความรักและสนับสนุนโค้ดบ้าง หรือเพียงแจ้งให้เราทราบเกี่ยวกับปัญหาใดๆ ที่คุณมี
เรายินดีรับรายงานปัญหาที่นี่ อย่าลืมเลือกเทมเพลตปัญหาที่เหมาะสมสำหรับปัญหาของคุณ เพื่อให้เรามั่นใจได้ว่าคุณได้ให้ข้อมูลที่จำเป็น
ก่อนที่จะส่งคำขอดึง โปรดตรวจสอบให้แน่ใจว่าคุณได้อ่านหลักเกณฑ์การบริจาคของเราแล้ว
โปรดอ่านไฟล์ใบอนุญาต
โครงการนี้ได้นำหลักจรรยาบรรณมาใช้ หากคุณมีข้อกังวลเกี่ยวกับจรรยาบรรณหรือพฤติกรรมที่คุณพบในโครงการ โปรดติดต่อเราที่ [email protected]
โปรดดูนโยบายความปลอดภัยของโครงการ