一个小型、快速、纯 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] 与我们联系。
请参阅项目安全政策。