一個小型、快速、純 JavaScript 類型剝離器,使用官方 TypeScript 解析器。
TypeScript 進入:
class C < T > extends Array < T > implements I {
// ^^^ ^^^^^^^^^^^^^^^^
private field ! : string ;
// ^^^^^^^ ^^^^^^^^^
method < T > ( this : T , a ?: string ) : void {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
JavaScript + 空格就出來了:
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
公開所需的 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 語法,則應手動完成解析。 valid.test.ts
中有一個 TSX 範例。
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 {};"
;
我們❤️貢獻。
您對這個項目有良好的體驗嗎?為什麼不分享一些愛並貢獻程式碼,或者只是讓我們知道您遇到的任何問題?
我們歡迎在這裡提出問題報告;請務必為您的問題選擇正確的問題模板,以便我們確保您提供必要的資訊。
在發送 Pull 請求之前,請務必閱讀我們的貢獻指南。
請閱讀許可證文件。
該項目已採用行為準則。如果您對本準則或您在專案中遇到的行為有任何疑問,請透過 [email protected] 與我們聯絡。
請參閱專案安全政策。