공식 TypeScript 파서를 사용하는 작고 빠르며 순수한 JavaScript 유형 제거 도구입니다.
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
ts-blank-space
사용하여 가져온 *.ts
를 평가하기 전에 사전 처리하는 데 필요한 Node.js 모듈 로더 후크를 노출합니다.
# 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 Request를 보내기 전에 기여 가이드라인을 꼭 읽어보시기 바랍니다.
LICENSE 파일을 읽어보세요.
이 프로젝트는 행동 강령을 채택했습니다. 본 강령이나 프로젝트에서 경험한 행동에 대해 우려 사항이 있는 경우 [email protected]으로 문의해 주십시오.
프로젝트 보안 정책을 참조하세요.