A typescript-go toolchain for compiler-powered transforms and type-safe execution.
ttsc: build, check, and transform.ttsx: execute TypeScript with type checking.- 10x faster than
ts-node. - type checking that
tsxdoes not provide.
- 10x faster than
- transformer support: compiler-powered libraries, such as
typia.
ttsx(CLI command) can run existingtypescript@6projects.
Install the native TypeScript preview package with ttsc:
npm i -D ttsc @typescript/native-previewRun TypeScript directly with ttsx (CLI command):
npx ttsx src/index.tsBuild, check, or watch the project with ttsc:
npx ttsc
npx ttsc --noEmit
npx ttsc --watchttsc reads compilerOptions.plugins from tsconfig.json.
{
"compilerOptions": {
"plugins": [
{ "transform": "typia/lib/transform" }
]
}
}The same configuration is used by both ttsc commands.
# compile
npx ttsc
# execute
npx ttsx src/index.tsThis gives compiler-powered libraries one transform path for both build-time and runtime execution.
A transform uses TypeScript types to generate JavaScript before runtime.
import typia, { tags } from "typia";
import { v4 } from "uuid";
const matched: boolean = typia.is<IMember>({
id: v4(),
email: "samchon.github@gmail.com",
age: 30,
});
console.log(matched); // true
interface IMember {
id: string & tags.Format<"uuid">;
email: string & tags.Format<"email">;
age: number &
tags.Type<"uint32"> &
tags.ExclusiveMinimum<19> &
tags.Maximum<100>;
}It is transformed into dedicated JavaScript:
import typia from "typia"; import * as __typia_transform__isFormatEmail from "typia/lib/internal/_isFormatEmail"; import * as __typia_transform__isFormatUuid from "typia/lib/internal/_isFormatUuid"; import * as __typia_transform__isTypeUint32 from "typia/lib/internal/_isTypeUint32"; import { v4 } from "uuid"; const matched = (() => { const _io0 = (input) => "string" === typeof input.id && __typia_transform__isFormatUuid._isFormatUuid(input.id) && "string" === typeof input.email && __typia_transform__isFormatEmail._isFormatEmail(input.email) && "number" === typeof input.age && __typia_transform__isTypeUint32._isTypeUint32(input.age) && 19 < input.age && input.age <= 100; return (input) => "object" === typeof input && null !== input && _io0(input); })()({ id: v4(), email: "samchon.github@gmail.com", age: 30, }); console.log(matched); // true
ttsc runs this transform during build, and ttsx runs through the same transform path during execution.
