Небольшой, быстрый и чистый очиститель типов 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 {};"
;
Мы ❤️ взносы.
Был ли у вас хороший опыт работы с этим проектом? Почему бы не поделиться своей любовью и не внести свой код или просто не сообщить нам о любых проблемах, которые у вас возникли с ним?
Мы приветствуем здесь сообщения о проблемах; Обязательно выберите подходящий шаблон проблемы для вашей проблемы, чтобы мы могли быть уверены, что вы предоставляете необходимую информацию.
Прежде чем отправлять запрос на включение, обязательно ознакомьтесь с нашими рекомендациями по участию.
Пожалуйста, прочтите файл ЛИЦЕНЗИИ.
В рамках этого проекта принят Кодекс поведения. Если у вас есть какие-либо сомнения по поводу Кодекса или поведения, с которым вы столкнулись в проекте, свяжитесь с нами по адресу [email protected].
Пожалуйста, ознакомьтесь с Политикой безопасности проекта.